题解 | #计算表达式#
计算表达式
https://www.nowcoder.com/practice/7b18aa6b7cc14f8eaae6b8acdebf890b
//stack <char> oper 操作符 //stack <double> num 中间数字 //从左向右遍历表达式 1.数字、num压栈 2.运算符 a.高优先级 oper压栈 b.低优先级/相等 先oper弹出一个、再num弹出两个进行运算压回num, //再把新的运算符压栈 #include <iostream> #include<cstdio> #include<map> #include<stack> #include<string> using namespace std; map<char, int> priority = { {'$', 0}, {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2} }; int main() { string str; while (getline(cin, str)) { if (str == "0") { break; } str.push_back('$');//补充一个终止符 stack<char>oper; stack<double>numb; string num; for (int i = 0; i < str.size(); ++i) { if (str[i] >= '0' && str[i] <= '9') { //用来搜索单独的0-9以组成一个数 num.push_back(str[i]); if (str[i] != str.size() - 1 && !(str[i + 1] >= '0' && str[i + 1] <= '9')) { numb.push(stod(num)); num = " "; } } //前面都在处理数 else { while (!oper.empty() && priority[oper.top()] >= priority[str[i]]) //说明比str[i]优先级更高的运算符都计算过了 //新来的运算符的优先级不高于栈顶的优先级 { char op = oper.top(); //弹出原来的运算符 oper.pop(); double rhs = numb.top(); numb.pop(); double lhs = numb.top(); numb.pop();//弹出左右两个操作数 switch (op) { case'+': numb.push(lhs + rhs); break; case'-': numb.push(lhs - rhs); break; case'*': numb.push(lhs * rhs); break; case'/': numb.push(lhs / rhs); break; } } oper.push(str[i]); } } cout<<numb.top()<<endl; } }