题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
/*
根据题意实现,
主要是如何处理遇到数字字符和运算符字符
遇到多个运算符的话用栈存储前一个运算符的结果给其他运算符用
需要左括号的话使用递归,遇到右括号就结束递归
遇到数字需要处理不止一个,要让算法可以处理一个或多个数字
每次处理运算符的时候的出的结果都在堆栈stack里,累加起来就是结果
*/
#include <iostream>
#include <stack>
using namespace std;
int p;
int compute(string& data) {
int num = 0;
int l = data.size();
char op = '+';
stack<int> st;
while (p < l) {
if (data[p] == '(') {
p++;
num = compute(data);
}
while (p < l && isdigit(data[p])) {
num = num * 10 + data[p] - '0';
p++;
}
switch (op) {
case '+' :
st.push(num);
break;
case '-':
st.push(-num);
break;
case '*': {
int t = st.top();
t *= num;
st.pop();
st.push(t);
break;
}
case '/': {
int t = st.top();
t /= num;
st.pop();
st.push(t);
break;
}
}
num = 0;
op = data[p];
if (data[p] == ')') {
p++;
break;
}
p++;
}
int sum = 0;
while (st.size()) {
sum += st.top();
st.pop();
}
return sum;
}
int main()
{
string data;
while (cin >> data) {
p = 0;
cout << compute(data) << endl;
}
}
