表达式的求值问题
程序代码:#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做的,但是结果就是不对,我也知道问题大概处在什么地方,但是我不知道具体怎么弄了,困扰我一周了,希望大家帮帮忙




