表达式求值是一道非常有趣的题目,他很好的演示了栈的应用,后缀表达式求值最为简单,当读入操作数时压栈,当读入运算符时,从栈中弹出两个数,运算完之后将结果再压栈。知道输入完之后,栈顶的值就是表达式的值。中缀表达式求值,用到了两个栈,一个存放数一个存操作数,当输入操作数时,直接进栈,当是运算符时,若优先级高于栈顶,则出栈运算再入栈,直到运算符优先级低于输入的那个。若输入的优先级低于栈顶,则直接入栈。若为括号,则出栈运算直到消掉括号。我将中缀表达式求值,中缀转后缀,后缀表达式求值写在一起,一次输入,三个结果,相互验证。
#include <iostream>
#include <string>
#include<stack>
using namespace std;
int Comp(char str1, char str2)
{
switch (str1)
{
case '+': case '-': if (str2 == '(' || str2 == '#') return 1; else return -1;
break;
case '*': case '/': if (str2 == '*' || str2 == '/') return -1; else return 1;
break;
case '(': return 1; break;
case ')': if (str2 == '(') return 0; else return -1;
break;
case '#': if (str2 == '#') return 0; else return -1;
break;
default: break;
}
}
//运算中缀表达式
void Compute(string ch)
{
stack<char> OPTR;
stack<int> OPND;
ch=ch+'#';
OPTR.push('#');
for (int i = 0;ch[i]!= '\0';)
{
if(ch[i]>='0'&&ch[i]<='9')
{
int m=ch[i++]-48;
OPND.push(m);
}
else
{
int k;
k=Comp(ch[i],OPTR.top());
if(k==1)
{
OPTR.push(ch[i++]);
}
else if(k==-1)
{
int z;
int y=OPND.top();
OPND.pop();
int x=OPND.top();
OPND.pop();
char op=OPTR.top();
OPTR.pop();
switch(op)
{
case '+': z = x + y; break;
case '-': z = x - y; break;
case '*': z = x * y; break;
case '/': if(y==0){cout<<"除数为0!"<<endl;return;}z = x / y; break;
default: break;
}
OPND.push(z);
}
else
{
OPTR.pop();
i++;
}
}
}
cout<<OPND.top();
}
//中缀转后缀
string Compute_tohou(string ch)
{
string result;
stack<char> OPTR;
ch=ch+'#';
OPTR.push('#');
for (int i = 0;ch[i]!='\0';)
{
if(ch[i]>='0'&&ch[i]<='9')
{
result=result+ch[i++];
}
else
{
int k;
k=Comp(ch[i],OPTR.top());
if(k==1)
{
OPTR.push(ch[i++]);
}
else if(k==-1)
{
char op=OPTR.top();
OPTR.pop();
result=result+op;
}
else
{
OPTR.pop();
i++;
}
}
}
return result;
}
//运算后缀表达式
int PostFixRun (string ch)
{
stack<int> stk;
for(int i=0;i<ch.size();i++)
{
if(ch[i]>='0'&&ch[i]<='9')
{
int m=ch[i]-48;
stk.push(m);
}
else
{
int b=stk.top();
stk.pop();
int a=stk.top();
stk.pop();
if(ch[i]=='+')
{
stk.push(a+b);
}
else if(ch[i]=='-')
{
stk.push(a-b);
}
else if(ch[i]=='*')
{
stk.push(a*b);
}
else
{
if(b==0){cout<<"除数为0!"<<endl;return 0;}
stk.push(a/b);
}
}
}
return stk.top();
}
int main()
{
string str;
cout << "请输入一个表达式:";
cin >> str;
cout << "中缀表达式的值是:";
Compute(str);
string res=Compute_tohou(str);
cout<<"\n中缀转后缀表达式的结果:"<<res<<endl;
int t=PostFixRun(res);
cout<<"后缀表达式的值是:"<<t<<endl;
return 0;
}
运行结果: