题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
#include <cctype> #include <string> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ int solve(string s) { stack<char> operatorStack; //运算符栈 stack<int> numStack; //操作数栈 for (int i = 0; i < s.size(); ++i) { if (isdigit(s[i])) { int num = 0; while (i < s.size() && isdigit(s[i])) { num = num * 10 + (s[i] - '0'); i++; } numStack.push(num); i--; } else if (s[i] == '(') { operatorStack.push(s[i]); } else if (s[i] == ')') { //计算括号内的运算 while (!operatorStack.empty() && operatorStack.top() != '(') { int value1 = numStack.top(); numStack.pop(); int value2 = numStack.top(); numStack.pop(); char op = operatorStack.top(); operatorStack.pop(); numStack.push(calculate(value2, value1, op)); } //将左括号出栈 operatorStack.pop(); } else { //假如是运算符 并且当前运算符的优先级要小于等于运算符栈顶的运算符 弹出操作数栈的上面两个元素与运算符栈顶的运算符计算 while (!operatorStack.empty() && getPriority(operatorStack.top()) >= getPriority(s[i])) { int value1 = numStack.top(); numStack.pop(); int value2 = numStack.top(); numStack.pop(); char op = operatorStack.top(); operatorStack.pop(); numStack.push(calculate(value2, value1, op)); } operatorStack.push(s[i]); } } //判读运算符栈是否还有运算符 如果还有就把剩余的计算完 while (!operatorStack.empty()) { int value1 = numStack.top(); numStack.pop(); int value2 = numStack.top(); numStack.pop(); char op = operatorStack.top(); operatorStack.pop(); numStack.push(calculate(value2, value1, op)); } return numStack.top(); } //获取优先级 int getPriority(char ch) { switch (ch) { case '+': case '-': return 1; case '*': return 2; default: return 0; } } //计算 int calculate(int value1, int value2, char op) { switch (op) { case '+': return value1 + value2; case '-': return value1 - value2; case '*': return value1 * value2; default: return 0; } } };