當前位置:成語大全網 - 新華字典 - 用Python3實現表達式求值

用Python3實現表達式求值

包括& ltmalloc.h & gt# include & ltstdio.h & gt# include & ltctype.h & gt//確定是否為字符的函數的頭文件# Define maxsize 100 typedef IntElemtype;typedef結構sqstack sqstack//由於SQL stack不是類型,struct sqstack是char ch[7]=;//將符號轉換為字符數組int f 1[7]=;//棧內元素優先級int F2[7]=;//堆棧StructSQStack { ElementTypeStack[maxsize]外的元素優先級;int top};void init stack(sq stack * s){ s-& gt;top = 0;} void Push(sqstack *s,elem type x){ if(s-& gt;top = = maxsize-1)printf(" Overflow \ n ");else { s-& gt;top++;s-& gt;堆棧[s-& gt;top]= x;} } void Pop(sqstack *s,elem type * x){ if(s-& gt;top==0) printf("下溢\ n ");else { * x = s-& gt;堆棧[s-& gt;top];s-& gt;top-;} } elem type Gettop(sq stack s){ if(s . top = = 0){ printf("下溢\ n ");返回0;} else返回s . stack[s . top];} element type f(char c){ switch(c){ case '+':返回0;大小寫'-':返回1;案例“*”:返回2;案例'/':返回3;case“(”:返回4;case ')':返回5;默認:返回6;} } char precend(char c 1,char C2){ int I 1 = f(c 1);int I2 = f(C2);//將字符轉換為數字if(f 1[I 1]>;F2[i2])//通過原設置' >'找到優先級返回;else if(f 1[I 1]& lt;f2[i2])返回' & lt';else返回“=”;} int Operate(elemtype a,elemtype theta,elem type b){ int sum;switch(theta){ case 0:sum = a+b;打破;案例1:sum = a-b;打破;情況二:sum = a * b;打破;默認:sum = a/b;}返回sum} evaluate expression(){ char c;int i=0,sum = 0;int k=1,j = 1;//設置開關變量elemtype x,theta,a,b;sqstack OPTR,OPNDinit stack(& amp;OPTR);推(& ampOPTR,f(' # ');//0推入堆棧init stack(&;OPND);c = getchar();if(c = = ch[2]| | c = = ch[3]| | c = = ch[5]| | c = = ch[6])//先忽略+和-的大小寫和左括號的大小寫{ printf(" Error 1 \ n ");k = 0;返回0;} if(c = = ch[0])c = getchar();//如果是+,用if(c==ch[1]) {j=0覆蓋;c = getchar();//同時覆蓋-sign} while(c!='#'||ch[Gettop(OPTR)]!= ' # '){ if(is digit(c)){ sum = 0;while(isdigit(c)) { if(!j){ sum = sum * 10-(c-' 0 ');//數字字符串前面加壹個負號(以前是:sum=-(sum*10)-(c-'0 ')結果是-12+13 = 21)} else sum = sum * 10。c = getchar();}推送(& ampOPND,sum);//如果還是數字,先不要堆棧,把數字串轉換成十進制數再堆棧,j = 1;} else if(k){ switch(precend(ch[Gettop(OPTR)],c)){ case ' & lt;':推(& ampOPTR,f(c));//Integer them c = getchar();if(c = = ch[0]| | c = = ch[1]| | c = = ch[2]| | c = = ch[3]| | c = = ch[5]| | c = ' \ n ')//移除下壹個。k = 0;返回0;//增加壹個開關變量,返回值0,使程序更具操作性} breakcase ' = ':Pop(& amp;OPTR & amp;x);c = getchar();if(c = = ch[0]| | c = = ch[1]| | c = = ch[2]| | c = = ch[3]| | c = = ch[5]| | c = ' \ n ')//將ch。k = 0;返回0;}破;大小寫“>”:Pop(& amp;OPTR & amp;θ);波普(& ampOPND & amp;b);波普(& ampOPND & amp;a);//註意這裏是誰先推棧的(&;OPND,Operate(a,theta,b));打破;} } }//這裏判斷是否以運算符結束是錯誤的(gettop(opnd));} main() { int結果;Printf("輸入妳的算術表達式:\ n ");result = evaluate expression();Printf ("Result: %d\n ",Result);返回0;}:這個計算器是用棧實現的。1,定義後綴計算器的堆棧結構。因為要存儲的單元格不多,這裏我們用順序堆棧,也就是用壹維數組來模擬堆棧:# define max 100 int stack[max];int top = 0;所以程序中定義了壹個長度為MAX的壹維數組,其中MAX被宏定義為常數100。我們可以修改宏定義,重新定義堆棧的大小。整數數據頂部表示堆棧的頂部。由於程序開始時堆棧中沒有數據元素,TOP被初始化為0。2.存儲後綴計算器的操作數。定義了stack[MAX]之後,我們就可以使用stack操作來存儲已經連續輸入的兩個操作數了。我們來看看是怎麽實現的:int push(int i) /*存儲操作數,棧操作*/{if (top