题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
#include <cctype>
#include <iostream>
#include <stack>
#include <unordered_map>
using namespace std;
bool isOpeartor(const char c) {
switch (c) {
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
return true;
}
return false;
}
int calculate(int lnum, int rnum, char opr) {
int result;
switch (opr) {
case '+':
result = lnum + rnum;
break;
case '-':
result = lnum - rnum;
break;
case '*':
result = lnum * rnum;
break;
case '/':
result = lnum / rnum;
break;
default:
result = -1;
break;
}
return result;
}
int main() {
stack<int> val;//操作数栈
stack<char> op;//运算符栈
op.push('#');
unordered_map<char, int> priority =
{{'#', 0}, {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}, {'(', 0}};
string expression;
getline(cin, expression);
for (size_t idx = 0; idx != expression.size(); ++idx) {
char c = expression.at(idx);
if (isOpeartor(c) && !(c == '-' && (idx == 0 ||
expression[idx-1] == '('))) { //运算符 特殊处理:-1*(-1-1)
if ('(' == c) {
op.push(c); //(运算符直接入栈
} else if (')' == c) { //)运算符则需要计算括号里面的内容
char opr = op.top();
op.pop();
while ( opr != '(') {
int num1 = val.top();
val.pop();
int num2 = val.top();
val.pop();
int result = calculate(num2, num1, opr);
val.push(result);
opr = op.top();
op.pop();//(出栈
}
} else if ( priority[c] > priority[op.top()] ) {
//不是括号运算符且优先级高于栈顶运算符,直接入栈
op.push(c);
} else {
//优先级低于栈顶运算符,则需要将栈顶运算符和操作数出栈,进行计算
while(priority[op.top()] >= priority[c]) {
char opr = op.top();
op.pop();
int num1 = val.top();
val.pop();
int num2 = val.top();
val.pop();
int result = calculate(num2, num1, opr);
val.push(result);
}
op.push(c);
}
} else if(isdigit(c) || c == '-') { //操作数或者负号
bool positive = true;
if(c == '-') {
positive = false;
++idx;
}
int num = 0;
while ( idx != expression.size() && isdigit( c = expression[idx] ) ) {
num = num * 10 + c - '0';
++idx;
}
if( !positive ) num = 0 - num;
val.push(num);
idx--;
} else {
continue;
}
}//字符串表达式遍历完成
//将栈中剩下的元素依次出栈并计算结果
while(op.top() != '#') {
char opr = op.top();
op.pop();
int rnum = val.top();
val.pop();
int lnum = val.top();
val.pop();
val.push(calculate(lnum, rnum, opr));
}
cout << val.top() << "\n";
}
// 64 位输出请用 printf("%lld")
#c/c++##求算术表达式的值##栈的应用#
查看10道真题和解析