我正在尝试编写一个C
程序,将中缀表达式转换为后缀并使用输入的值进行计算。当我输入(2 + 14)* 5时,我得到(2 14)5 * +但它应该是2 14 + 5 *。所以我的问题:
感谢您的帮助。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define oper(x) (x=='+' || x=='-' || x=='*' || x=='/')
char in[30], post[30], stack[30];
int top=-1;
void push(char x)
{
stack[++top]=x;
}
char pop()
{
return stack[top--];
}
int precedence(char c)
{
if (c=='+' || c=='-')
return 1;
if (c=='*' || c=='/')
return 2;
if (c=='(')
return 3;
}
main()
{
char c;
int l,i,j=0,st1[20],k,h,f,eval,s,N;
printf("Enter the infix expression : ");
scanf("%s",&in);
l=strlen(in);
for(i=0;i<=l;i++)
{
if(oper(in[i]))
{
post[j++]=' ';
while(precedence(in[i])<precedence(stack[top]))
{
post[j++]=stack[top];
pop();
post[j++]=' ';
}
push(in[i]);
}
else if(in[i]=='\0')
{
while(top!=-1)
{
post[j++]=' ';
post[j++]=stack[top];
pop();
}
}
else
post[j++]=in[i];
}
post[j]='\0';
printf("Postfix Expression : %s\n",post);
i=0;top=-1;f=0;k=0;
while(i<j)
{
if(oper(post[i]))
{
f=1;
c=post[i];
eval=0;
switch(c)
{
case '+':
eval=st1[top-1]+st1[top];
break;
case '-':
eval=st1[top-1]-st1[top];
break;
case '*':
eval=st1[top-1]*st1[top];
break;
case '/':
eval=st1[top-1]/st1[top];
break;
}
top--;
st1[top]=eval;
}
else if(post[i]==' ')
{
if(f==0)
{
h=i-k;
s=0;
while(post[h]!=' ')
{
N=(int)post[h];
N=N-48;
s=s+N*(pow(10,(k-1)));
k--;
h++;
}
st1[++top]=s;
}
k=0;
}
else
{
k++;
f=0;
}
i++;
}
printf("Value : %d\n",st1[top]);
}
答案 0 :(得分:1)
我没有在你的代码中查看太多细节,但你似乎没有以任何特殊方式处理输入中的括号;它们具有非常具体的意义WRT操作顺序。
我的猜测是你的程序正在像数字一样处理parens,并且正在解析输入为(分别代替左和paren和右paren的L和R)L2 +(14R * 5),在这种情况下输出是正确的。
答案 1 :(得分:-1)
在函数precedence
中,您应该尝试
if((c=='(') || (c==')')) {
return 3;
}