#include <iostream>
#include <cstring>
#include <unordered_map>
#include <stack>
using namespace std;
stack<int> num;
stack<char> op;
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(){
unordered_map<char,int> pr{{'+',1},{'-',1},{'*',2},{'/',2}};
string str;
cin >> str;
for(int i = 0; i < str.size(); i ++){
char c = str[i];
if(isdigit(c)){
int x = 0,j = i;
while(j < str.size() && isdigit(str[j])){ //组装数字
x = x * 10 + str[j ++] - '0';
}
i = j - 1; // 恢复当前指针位置
num.push(x);
}else if(c == '('){
op.push(c);
}else if(c == ')'){
while(op.top() != '('){
eval();
}
op.pop(); // 左括号
}else{
while(op.size() && pr[c] <= pr[op.top()]){
eval();
}
op.push(c);
}
}
while(op.size()){
eval();
}
cout << num.top() << endl;
return 0;
}
HiCode信息学奥赛两日一题 T3表达式求值
最新推荐文章于 2021-05-02 17:44:57 发布