这只是个小做业,要求实现简单中缀表达式求值code
所谓前缀、中缀、后缀,是指运算符相对于运算数的位置而言,看以下例子:内存
(1 + 2) × 3 - 4 就是中缀表达式
- × + 1 2 3 4 就是前缀表达式
1 2 + 3 × 4 - 就是后缀表达式rem
因此其实只有加、减、乘、除以及括号的四则运算,大体思路是定义了两个栈:操做符栈和操做数栈,顾名思义,操做符用于存放运算符,操做数用于存放运算数字。代码以下:it
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> /** * 操做栈的相关定义 */ typedef struct { char *elem; int top; int size; }Sqstack; //定义操做符栈和操做数栈 Sqstack Ope; Sqstack Num; void Initstack(Sqstack *s) //初始化栈 { s->size=50; s->top=0; s->elem=(char*)malloc(s->size*sizeof(char)); if(!s->elem) printf("OVERFLOW"); } void Push(Sqstack *s,char e) //入栈 { if(s->top>=s->size)//栈内存不够时 { char *newelem; int increment=50; newelem=(char*)realloc(s->elem,(s->size+increment)*sizeof(char)); s->elem=newelem; s->size=s->size+increment; } s->elem[s->top]=e; s->top++; } void Pop(Sqstack *s)//出栈 { s->top--; } char GetTop(Sqstack *s)//取栈顶元素 { char e; s->top--; e=s->elem[s->top]; return e; } void calculate(Sqstack *ope,Sqstack *num) { char num1,num2,op; num2=GetTop(num); num1=GetTop(num); op=GetTop(ope); int tmpResult=0; switch(op) { case '+': tmpResult=num1+num2; break; case '-': tmpResult=num1-num2; break; case '*': tmpResult=num1*num2; break; case '/': tmpResult=num1/num2; break; } Push(num,tmpResult);//入栈 } void dealExpression() { Initstack(&Ope); Initstack(&Num); printf("请输入正确的中缀表达式(以#号结束):"); char onechar; //单个字符 scanf("%c",&onechar); while(onechar!='#') { switch(onechar) { case '+': case '-': if(Ope.top&&Ope.elem[Ope.top-1]!='(') { calculate(&Ope,&Num); } Push(&Ope,onechar); //入栈 scanf("%c",&onechar); break; case '*': case '/': if(Ope.top&&(Ope.elem[Ope.top-1]=='*'||Ope.elem[Ope.top-1]=='/')) { calculate(&Ope,&Num); } Push(&Ope,onechar); //入栈 scanf("%c",&onechar); break; case '(': Push(&Ope,onechar); //入栈 scanf("%c",&onechar); break; case ')': while(Ope.elem[Ope.top-1]!='(')//当前是')',则Ope栈必定能有'('匹配到,即Ope栈必定不为空 { calculate(&Ope,&Num); } Pop(&Ope);//出栈,弹出左括号 scanf("%c",&onechar); break; default://onechar为数字,则入num栈 char opNum=0; do{ opNum=opNum*10+onechar-'0'; scanf("%c", &onechar); }while(onechar>='0' && onechar<='9'); Push(&Num,opNum); break; }//end switch }//end while while(Ope.top) { calculate(&Ope,&Num); } int result; result=Num.elem[Num.top-1]; printf("计算结果是%d\n", result); } int main() { dealExpression(); return 0; }