表达式求值
操作步骤:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#include<stack>
using namespace std;
stack<char> op; //符号栈
stack<int> num; //数字串
void eval() //操作:弹出两个操作数和一个运算符并计算结果,将结果压入栈
{
int b=num.top();num.pop();
int a=num.top();num.pop();
char c=op.top();op.pop();
int x;
if(c=='+') x=a+b;
else if(c=='-') x=a-b;
else if(c=='*') x=a*b;
else x=a/b;
num.push(x);
}
int main()
{
string s;
cin>>s;
unordered_map<char,int> pr{{'+',1},{'-',1},{'*',2},{'/',2}};//定义算符优先级
for(int i=0;i<s.size();i++)
{
if(isdigit(s[i])) //1.数字压入数字栈
{
int j=i,x=0;
while(j<s.size()&&isdigit(s[j])) x=x*10+s[j++]-'0';
i=j-1;
num.push(x);
}
else if(s[i]=='(') op.push(s[i]); //2.左括号压入符号串
else if(s[i]==')') //3.右括号操作至左括号
{
while(op.size()&&op.top()!='(') eval();
op.pop();
}
else //4.运算符:依次弹出栈中优先级大于等于当前运算符的所有运算符
{
while(op.size() && op.top()!='(' && pr[op.top()] >= pr[s[i]]) eval();
op.push(s[i]);
}
}
while(op.size()) eval(); //5.操作完剩下的运算符
cout<<num.top()<<endl;
return 0;
}