题解 | #表达式求值#
表达式求值
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();
}

