题目分析
表达式计算可分为两步:
1、将中缀表达式转为后缀表达式
2、计算后缀表达式
注意点
1、将中缀转为后缀时,操作符的优先级必须大于操作符栈顶元素才可入栈,否则要将栈中元素出栈直至栈顶元素优先级小于要入栈的操作符,注意栈顶元素优先级等于要入栈的的操作符也是不行的,必须小于;
2、将中缀转为后缀时,遇到左括号直接将其压入操作符栈,遇到右括号,则将操作符栈顶元素出栈直到遇到左括号,然后两个括号湮灭;
3、将中缀转为后缀时,操作数可能不止一位,要注意多位连续操作数合并
代码实现
#include<bits/stdc++.h>
using namespace std;
struct node{
int val;
char op;
int isval;
};
queue<node> q;
stack<node> stk;
map<char,int> mp;
//将中缀表达式转为后缀表达式
void getfront(string str){
int len=str.size();
int num=0;
for(int i=0;i<len;){
//cout<<str[i]<<endl;
if(str[i]>='0'&&str[i]<='9'){
num=num*10+str[i]-'0';
i++;
while(i<len&&str[i]>='0'&&str[i]<='9'){
num=num*10+str[i]-'0';
i++;
}
node p;
p.val=num;
p.isval=1;
q.push(p);
num=0;
continue;
}
else{
if(str[i]=='('){
node p;
p.op=str[i];
p.isval=0;
stk.push(p);
i++;
continue;
}
if(str[i]==')'){
while(stk.top().op!='('){
node p=stk.top();
stk.pop();
q.push(p);
}
stk.pop();
i++;
continue;
}
while(!stk.empty()&&mp[stk.top().op]>=mp[str[i]]){
node p=stk.top();
stk.pop();
q.push(p);
}
node p;
p.op=str[i];
p.isval=0;
stk.push(p);
i++;
}
}
while(!stk.empty()){
node p=stk.top();
stk.pop();
q.push(p);
}
}
//计算后缀表达式
int cal(){
while(!q.empty()){
node p=q.front();
q.pop();
if(p.isval==1){
stk.push(p);
}
else{
int num;
int num2=stk.top().val;
stk.pop();
int num1=stk.top().val;
stk.pop();
if(p.op=='+'){
num=num1+num2;
node t;
t.val=num;
t.isval=1;
stk.push(t);
}
if(p.op=='-'){
num=num1-num2;
node t;
t.val=num;
t.isval=1;
stk.push(t);
}
if(p.op=='*'){
num=num1*num2;
node t;
t.val=num;
t.isval=1;
stk.push(t);
}
if(p.op=='/'){
num=num1/num2;
node t;
t.val=num;
t.isval=1;
stk.push(t);
}
}
}
node p=stk.top();
return p.val;
}
int main(){
string str;
cin>>str;
mp['+']=mp['-']=1;
mp['*']=mp['/']=2;
getfront(str);
cout<<cal()<<endl;
return 0;
}