题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
#include <algorithm>
#include <cctype>
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int cal(int a, int b, char fu) {
if (fu == '+') return a + b;
if (fu == '-') return a - b;
if (fu == '*') return a * b;
if (fu == '/') return a / b;
return 0;
}
int cal4(vector<string>& res) {
if (res.size() == 1) return stoi(res[0]);
reverse(res.begin(), res.end());
if (res[0] == "-") res.insert(res.begin(), "0");
for (int i = 0; i < res.size(); i++) {
if (res[i] == "*" || res[i] == "/") {
// cout << res[i - 1] <<" "<< res[i + 1]<<endl;
int tem = cal(stoi(res[i - 1]), stoi(res[i + 1]), res[i][0]);
res[i - 1] = to_string(tem);
res.erase(res.begin() + i, res.begin() + i + 2);
i--;
}
}
int last = stoi(res[0]);
for (int i = 0; i < res.size(); i++) {
if (res[i] == "+" || res[i] == "-") {
last = cal(last, stoi(res[i + 1]), res[i][0]);
}
}
return last;
}
int main() {
string s;
while (cin >> s) { // 注意 while 处理多个 case
stack<string> b;
int last_fu = -1;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '(' ||
s[i] == ')') {
// cout << s[i] << endl;
b.push(s.substr(last_fu + 1, i - last_fu - 1));
string tem = "1";
tem[0] = s[i];
b.push(tem);
last_fu = i;
}
if (s[i] == ')') {
b.pop();//右括号
vector<string> sub;
while (b.top() != "(") {
if(!b.top().empty())sub.push_back(b.top());
b.pop();
}
b.pop();//左括号
// for (auto &i : sub) cout <<i;
int cal_ = cal4(sub);
b.push(to_string(cal_));
}
}
if (isdigit(s.back())) b.push(s.substr(last_fu + 1, s.size() - 1 - last_fu));
vector<string> res;
while (!b.empty()) {
if(!b.top().empty())res.push_back(b.top());
b.pop();
}
cout << cal4(res);
}
}
// 64 位输出请用 printf("%lld")


