源**:
#include<>
#include <>
#include <>
#define plus 0
#define minus 1
#define power 2
#define divide 3
#define leftp 4
#define righp 5
#define startend 6
#define digit 7
#define point 8
#define num 7
#define no 32767
#define stacksize 20
//運算子
char a
//優先關係矩陣,規定:=為 0,>為 1,《為-1,空為 no
int prioritytable[7][7]=,,,
,,,};
int menu(void)
while(num<1 || num>4);
return(num);
}/* 輸入表示式函式 */
void inputexpression(char str)
/* 確定當前字元型別 */
/* 若為運算子,則返回運算子在運算子陣列中的序號 */
/* 若為數字字元,則返回 digit */
/* 若為小數點字元,則返回 point */
/* 否則為非法字元,返回-1 */
int getchartype(char ch)
/* 表示式計算 */
/* 輸入引數:char *str,表示式字串 */
/* 輸出引數:double *result,表示式計算結果 */
/* 函式返回值:1 計算正確 */
/* 0 表示式有錯 */
int excute(char *str,double *result)
{ int pp,toptr,topnd,chartype,optr[stacksize];
double number,temp,opnd[stacksize];
optr[0]=startend;
toptr=1;
topnd=0;
pp=0;
while((str[pp]))
{chartype=getchartype(str[pp]); //確定字元型別
switch(chartype)
{case -1: //不是表示式中的字元,表示式有錯
return(0);
case digit: //數字字元,實數的開始字元
number=0;
while(str[pp]>='0' && str[pp]<='9') //處理實數的整數部分
number=number*10+(str[pp]-48); //48為0的acsll碼
pp++;
if(str[pp遇到小數點
temp=10.0;
pp++;
while(str[pp]>='0' && str[pp]<='9') //處理實數的小數部分
number=number+(str[pp]-48)/temp;
temp=temp*10;
pp++;
opnd[topnd]=number; //運算元進棧
topnd++;
break;
case point: //小數點,以小數點開頭的實數
number=0;
temp=10.0;
pp++;
while(str[pp]>='0' && str[pp]<='9')
number=number+(str[pp]-48)/temp;
temp=temp*10;
pp++;
opnd[topnd]=number;
topnd++;
break;
case plus: //加
case minus: //減
case power: //乘
case divide: //除
int i,j;
i=prioritytable[optr[toptr-1]][chartype];
if(i==-1)//棧頂元素優先順序小,直接輸入
optr[toptr]=chartype;
toptr++;
if(i==1)//棧頂元素優先順序大
while(i==1)
j=optr[toptr-1];//把棧頂運算子賦給j
if(j==0)//加
opnd[topnd-2]=opnd[topnd-2]+opnd[topnd-1];
if(j==1)//減
opnd[topnd-2]=opnd[topnd-2]-opnd[topnd-1];
if(j==2)//乘
opnd[topnd-2]=opnd[topnd-2]*opnd[topnd-1];
if(j==3)//除
opnd[topnd-2]=opnd[topnd-2]/opnd[topnd-1];
topnd--;
toptr--;
i=prioritytable[optr[toptr-1]][chartype];//判斷是否繼續迴圈
optr[toptr]=chartype;
toptr++;
pp++;
break;
case leftp: //左括號直接進棧
optr[toptr]=4;
toptr++;
pp++;
break;
case righp: //右括號
if(optr[toptr-1]==4)//若棧頂是左括號,則左括號出棧,pp 指向下乙個字元
toptr--;
pp++;
break;
else
if(optr[toptr-1]==6)//若棧頂是#(即「6」),則左括號和右括號不配對,結束處理,返回出錯標誌(0)
return(0);
else
棧頂是運算子,則取運算子棧頂運算子和運算元棧頂運算元進行運算,參與運算的運算子和運算元出棧,運算結果進運算元棧重複該操作,直到棧頂出現左括號「(」
int j;
j=optr[toptr-1];
if(j==0)
opnd[topnd-2]=opnd[topnd-2]+opnd[topnd-1];
if(j==1)
opnd[topnd-2]=opnd[topnd-2]-opnd[topnd-1];
if(j==2)
opnd[topnd-2]=opnd[topnd-2]*opnd[topnd-1];
if(j==3)
opnd[topnd-2]=opnd[topnd-2]/opnd[topnd-1];
topnd--;
toptr--;
break;
case startend: // 遇到表示式結束符#
while(optr[toptr-1]!=startend)//若當前字元不為#:依次從運算子棧取出運算子和從運算元棧取出運算元進行計算,
直到運算子棧的棧頂為#為止。
int j;
j=optr[toptr-1];
if(j==0)
opnd[topnd-2]=opnd[topnd-2]+opnd[topnd-1];
if(j==1)
opnd[topnd-2]=opnd[topnd-2]-opnd[topnd-1];
算術表示式求值課設報告
資料結構課程設計 設計說明書 數學與電腦科學學院 2012年 9月 7日 資料結構課程設計評閱書 注 指導教師成績60 答辯成績40 總成績合成後按五級制記入 課程設計任務書 2011 2012學年第2學期 專業學號姓名 課程設計名稱資料結構課程設計 設計題目表示式求值演算法的實現 完成期限 自 2...
表示式求值
課程設計報告 課程名稱資料結構 課題名稱表示式求值 專業電腦科學與技術 班級0901 學號 200903010102 姓名覃宇星 指導教師李珍輝鄧作傑郭芳 2011年7月7日 湖南工程學院 課程設計任務書 課程名稱 c語言程式設計 課題表示式求值 專業班級計算機0901 學生姓名 學號指導老師周鐵山...
資料結構算術表示式求值實驗報告
目錄1 前言 1 2 概要設計 1 2.1 資料結構設計 1 2.2 演算法設計 1 2.3 adt描述 2 2.4 功能模組分析 2 3 詳細設計 3 3.1 資料儲存結構設計 3 3.2主要演算法流程圖 或演算法偽 3 4 軟體測試 6 5 心得體會 8 參考文獻 8 附錄 8 在計算機中,算術...