#include<iostream> #include<stack> #include<cmath> using namespace std; void cal(stack<int>& num, stack<char>& sign){ int num1 = num.top(); num.pop(); int num2 = num.top(); num.pop(); char op = sign.top(); sign.pop(); if(op == '+') num2 = num2 + num1; else if(op == '-') num2 = num2 - num1; else if(op == '*') num2 = num2 * num1; else if(op == '/') num2 = num2 / num1; num.push(num2); } int main(){ string line; cin >> line; char op; stack<char> sign; stack<int> num; // 在头尾添加括号不需要额外的末尾处理 sign.push('('); line += ')'; for(int i = 0; i < line.size(); ++i){ if(line[i] >= '0' && line[i] <= '9'){ int count = 0; while(isdigit(line[i + count])) ++count; string temp = line.substr(i, count); // 在数字前面有负号 if((1 > 1 || line[i - 1] == '-' && (line[i - 2] == '(' || line[i - 2] == '[' || line[i - 2] == '{') ) || (i == 1 && line[0] == '-')){ sign.pop(); // 将错误当作运算符的符号取出来 num.push(-stoi(temp)); } else num.push(stoi(temp)); i = i + count - 1; } else{ // 左括号直接入栈 if(line[i] == '(' || line[i] == '[' || line[i] == '{') sign.push(line[i]); // 遇到右括号,将括号中所有运算符出栈进行计算 else if(line[i] == ')'){ do{ op = sign.top(); if(op != '(') cal(num, sign); else sign.pop(); // 去除左括号,不然留在栈中会造成程序错误 }while(op != '('); }else if(line[i] == ']'){ do{ op = sign.top(); if(op != '[') cal(num, sign); else sign.pop(); }while(op != '['); }else if(line[i] == '}'){ do{ op = sign.top(); if(op != '{') cal(num, sign); else sign.pop(); }while(op != '{'); }else if(line[i] == '+' || line[i] == '-'){ // 加减法优先级低,遇到加减法需要将前面所有的运算符弹出栈,括号除外 while(!sign.empty()){ op = sign.top(); if(op == '(' || op == '[' || op == '{') break; cal(num, sign); } sign.push(line[i]); }else if(line[i] == '*' || line[i] == '/'){ // 乘除优先级高于加减,因此只用弹出乘除符号 while(!sign.empty()){ op = sign.top(); if(op == '(' || op == '[' || op == '{' || op == '+' || op == '-') break; cal(num, sign); } sign.push(line[i]); } } } cout << num.top(); return 0; }