题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
#include <iostream> #include <sstream> #include <stack> #include <string> using namespace std; int stringtoint(string str) { istringstream s(str); int temp; s >> temp; return temp; } void compute(stack<int>& nums, stack<char>& opers) { int later = nums.top(); nums.pop(); int former = nums.top(); nums.pop(); char oper = opers.top(); opers.pop(); int z; switch (oper) { case '+': z = former + later; break; case '-': z = former - later; break; case '*': z = former * later; break; case '/': z = former / later; break; } nums.push(z); } bool priority_first_last(char first, char last) { if (last == '(' || first == '(') { return false; } if ((first == '+' || first == '-') && (last == '*' || last == '/')) { return false; } return true; } int main() { string input; cin >> input; stack<int> nums; stack<char> opers; bool last_is_oper = true; for (int i = 0; i < input.size(); i++) { if (input[i] == ')') { while (opers.top() != '(') { compute(nums, opers); } opers.pop(); } else if (last_is_oper) { int j = i; if (input[i] == '-' || input[i] == '+') { i++; } while (isdigit(input[i])) { i++; } if (i != j) { string temp = input.substr(j, i - j); nums.push(stringtoint(temp)); } i--; last_is_oper = false; } else { while (opers.empty() == false && priority_first_last(opers.top(), input[i])) { compute(nums, opers); } opers.push(input[i]); last_is_oper = true; } }//for while (opers.empty() == false) { compute(nums, opers); } cout << nums.top(); }