表达式求值(数值范围为0~9)
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
//定义操作符的优先级
int oppriority(char c){
if(c=='+'||c=='-') return 1;
else if(c=='*'||c=='/') return 2;
else return 0;//"("设置为0,当操作符出栈遇到"("时,停止出栈
}
//中缀转后缀
string inTopost(string s){
stack<char> stk;//操作符栈
string res;
for(char c:s){
if(c==' ') continue;//跳过空格
if(isdigit(c)){//c是数字
res=res+c;//数字直接加入表达式
}
else if(c=='(') stk.push(c);
else if(c==')'){//遇到),依次弹出栈内的操作符,直到遇到(时停止
while(!stk.empty()&&stk.top()!='('){
res+=stk.top();
stk.pop();
}
stk.pop();//弹出(
}
else{
while(!stk.empty()&&oppriority(c)<=oppriority(stk.top())){
res+=stk.top();
stk.pop();
}
stk.push(c);
}
}
while(!stk.empty()){
res+=stk.top();
stk.pop();
}
return res;
}
//后缀表达式求值
int getanswer(string str){
stack<int> sum;
for(char c:str){
if(isdigit(c)){//isdigit函数,检查传入的参数字符是否为数字,是的话返回非0值;不是的话,返回0
sum.push(c-'0');//转字符为数字
}
else{
int x=sum.top();
sum.pop();
int y=sum.top();
sum.pop();
int s=0;
if(c=='+') s=y+x;
if(c=='-') s=y-x;
if(c=='*') s=y*x;
if(c=='/') s=y/x;
sum.push(s);
}
}
return sum.top();//最后栈内剩下一个元素,即为最后的值
}
int main(){
string str;
getline(cin,str);
string infix=inTopost(str);
cout<<getanswer(infix)<<endl;
return 0;
}