表达式的求值问题
程序代码:
#include<stdio.h> #define StackMaxlSize 100 typedef struct { char stack[StackMaxlSize]; int top; }stack1; typedef struct { char stack[StackMaxlSize]; int top; }stack2; int In(char c) { if((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='#')||(c=='(')||(c==')')) return 1; else return 0; } void InitStack1(stack1 *S)//初始化操作符空栈 { S->top=-1;//负数1表示栈空 } void InitStack2(stack2 *S)//初始化操作数空栈 { S->top=-1; } void Push1(stack1 *S,char ch)//操作符入栈 { S->top++; S->stack[S->top]=ch; } void Push2(stack2 *S,char ch)//操作数入栈 { S->top++; S->stack[S->top]=ch; } void Pop1(stack1 *S,char *p)//操作符出栈运算 { *p=S->stack[S->top]; S->top--; } void Pop2(stack2 *S,int *p)//操作数出栈运算 { *p=S->stack[S->top]; S->top--; } char Precede(char ch1,char ch2) { char ch; printf("现在栈顶元素ch1=%c\n",ch1); switch(ch1) { case '+': if((ch2=='*')||(ch2=='/')||(ch2=='(')) ch='<'; else ch='>'; break; case '-': if((ch2=='*')||(ch2=='/')||(ch2=='(')) ch='<'; else ch='>'; break; case '*': if((ch2=='(')) ch='<'; else ch='>'; break; case '/': if((ch2=='(')) ch='<'; else ch='>'; break; case '#': if((ch2=='#')) ch='='; else ch='<'; break; case '(': if((ch2=='+')||(ch2=='-')||(ch2=='*')||(ch2=='/') ) ch='<'; else ch='>'; break; } return ch; } char GetTop1(stack1 *S) { return S->stack[S->top]; //S->top--; } char GetTop2(stack2 *S) { return S->stack[S->top]; // S->top--; } void ClearStack1(stack1 *S)//清空操作符栈 { S->top=-1; } void ClearStack2(stack2 *S)//清空操作符栈 { S->top=-1; } int Operate(int a,char theta,int b)//核心运算 { int Oper; char ch=theta; switch(ch) { case '+':Oper=a+b;break; case '-': Oper=a-b;break; case '*':Oper=a*b;break; case '/': Oper=a/b;break; } return Oper; } void main() { stack1 OPTR1,*OPTR=&OPTR1;///操作符栈 stack2 OPND1,*OPND=&OPND1;//操作数栈 InitStack1(OPTR);//初始化操作符栈 Push1(OPTR,'#');//把表达式的起始符号“#”入栈 InitStack2(OPND);//初始化操作数栈 char c,x,theta; int a,b,s; printf("请输入表达式,以#号结束:"); c=getchar();//接受表达式的第一个字符 fflush(stdin); while((c!='#'||GetTop1(OPTR)!='#'))//#号同时是表达式的截至符号 { fflush(stdin); if(!In(c))//判断是否当前表达式字符是算符,不是则进操作数栈 { s=c-'0'; Push2(OPND,s); c=getchar(); fflush(stdin); } else//如果是运算符就进操作符栈 { switch(Precede(GetTop1(OPTR),c))//判断当前运算符和栈顶运算符的优先级 { fflush(stdin); case '<':Push1(OPTR,c);//栈顶运算符的优先级低于当前运算符,把当前运算符入栈 printf("哈哈我进栈了%c\n",c);//验证调用问题 c=getchar(); fflush(stdin); break; case '=':Pop1(OPTR,&x);//两个运算符优先级相同就把栈顶运算符出栈 c=getchar(); fflush(stdin); break; case '>':Pop1(OPTR,&theta);//栈顶运算符的优先级高于当前运算符,把栈顶元素出栈参与运算 Pop2(OPND,&b);//连续出栈两个操作数做栈顶运算符的运算 Pop2(OPND,&a); Push2(OPND,Operate(a,theta,b));//运算结果如操作数栈 c=getchar(); break; } } } c=GetTop2(OPND);//取出最后运算结果并输出 printf("表达式运算最终结果为:"); printf("%d\n",c); }我这个是针对这个式子5*(2+14)-28/4做的,但是结果就是不对,我也知道问题大概处在什么地方,但是我不知道具体怎么弄了,困扰我一周了,希望大家帮帮忙