中缀表达式求值的方法—栈

Posted lgrdeboke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式求值的方法—栈相关的知识,希望对你有一定的参考价值。

对于像是1+2的中缀表达式,我们可以轻松地运用代码来算出结果。

但是对于1+(2^2)/3*4这样的表达式,事情就变得有些复杂了...

对于上述的表达式,我们可以运用栈的相关知识来解决—建立两个栈,栈1放数字,栈2放运算符;遇到数字时入栈1;遇到运算符时,若栈2为空,则pop出栈1中的两个数运算,将运算完的结果压入栈1;若栈2非空,则将当前运算符与栈2中栈顶的运算符进行比较优先级,再进行下一步操作。代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <stack>
#define Maxsize 50
using namespace std;
stack<int> S1;
stack<char> S2;
void Calculate(char a)
{
int b,c,d=0;
if(a==‘+‘){
b=S1.top();
S1.pop();
c=S1.top();
S1.pop();
d=c+b;
S1.push(d);
}
if(a==‘-‘){
b=S1.top();
S1.pop();
c=S1.top();
S1.pop();
d=c-b;
S1.push(d);
}
if(a==‘*‘){
b=S1.top();
S1.pop();
c=S1.top();
S1.pop();
d=c*b;
S1.push(d);
}
if(a==‘/‘){
b=S1.top();
S1.pop();
c=S1.top();
S1.pop();
d=c/b;
S1.push(d);
}
if(a==‘^‘){
b=S1.top();
S1.pop();
c=S1.top();
S1.pop();
d=pow(c,b);
S1.push(d);
}
}
int main()
{
char a[50],e;
int num;
int sum=0;
cin.getline(a,50);
for(int i=0;i<strlen(a);i++){
if(a[i]>=‘0‘&&a[i]<=‘9‘){
num=0;
while((a[i]>=‘0‘&&a[i]<=‘9‘)){
num=num*10+(a[i]-‘0‘);
i++;
}
S1.push(num);
//cout<<S1.top()<<endl;
i--;
}
if(!isdigit(a[i])){
if(S2.empty()){
S2.push(a[i]);
//cout<<S2.top()<<endl;
}
//^
else if(a[i]==‘^‘){
if(S2.top()!=‘^‘) S2.push(a[i]);
else{
while(!S2.empty()&&S2.top()==‘^‘){
Calculate(S2.top());
S2.pop();
}
S2.push(a[i]);
}
}
//* /
else if(a[i]==‘*‘||a[i]==‘/‘){
while(!S2.empty()&&S2.top()!=‘+‘&&S2.top()!=‘-‘&&S2.top()!=‘(‘){
Calculate(S2.top());
S2.pop();
}
S2.push(a[i]);
}
//+ -
else if(a[i]==‘+‘||a[i]==‘-‘){
while(!S2.empty()&&S2.top()!=‘(‘){
Calculate(S2.top());
S2.pop();
}
S2.push(a[i]);
}
else if(a[i]==‘(‘) S2.push(a[i]);
else if(a[i]==‘)‘){
while(!S2.empty()&&S2.top()!=‘(‘){
Calculate(S2.top());
S2.pop();
}
S2.pop();
}
}
}
while(!S2.empty()){
Calculate(S2.top());
S2.pop();
}
cout<<int(S1.top());
return 0;
}

运用c++需要用到118行代码,但是运用python,一行代码就可以解决,python代码如下:

print(eval(input().replace(‘/‘,‘//‘).replace(‘^‘,‘**‘)))

人生苦短,我用python。

以上是关于中缀表达式求值的方法—栈的主要内容,如果未能解决你的问题,请参考以下文章

中缀表达式求值的思路分析与代码实现

中缀表达式求值的思路分析与代码实现

刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

中缀表达式转换成后缀表达式并求值

中缀表达式转换为后缀表达式

中缀表达式转换为后缀表达式