#include "string" #include "cstdio" #include "stack" #include "map" using namespace std; // 描述 // 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 //输入描述: // 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。 // 没有非法表达式。 // 当一行中只有0时输入结束,相应的结果不要输出。 //输出描述: // 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 int main() { char buf[1024]; map<char, int> prior = { {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}, }; while (NULL != fgets(buf, sizeof buf, stdin)) { if ('0' == buf[0]) { break; } string input = buf; string num; stack<double> num_stack; stack<char> op_stack; for (int i = 0; i < input.length(); ++i) { // 这里保留\n 原因是 为了让最后的 op栈完全清空 参与彻底的计算 // 最后的结果保留在num栈中 // 1. 如果是数字 if (input[i] >= '0' && input[i] <= '9') { num += input[i]; } else if (' ' == input[i]) { // 2. 如果是空格 // 2.1 如果前面的数字没处理 if (!num.empty()) { num_stack.push(stod(num)); num.clear(); } // 2.2 如果数字处理了 就什么都不做 } else { if (!num.empty()) { num_stack.push(stod(num)); num.clear(); } // 3. 如果是运算符 // 3.1 如果运算符栈不为空 且当前运算符的优先级 低于 栈顶运算符,则参与计算, // 直至栈运算符为空, 或当前运算符优先级高于栈内运算符 while (!op_stack.empty() && prior[op_stack.top()] >= prior[input[i]]) { // 这里,当前运算符只是起比较作用 判断是否发动计算 并不会在这里入栈 char op = op_stack.top(); op_stack.pop(); double second_num = num_stack.top(); num_stack.pop(); double first_num = num_stack.top(); num_stack.pop(); switch (op) { case '+': num_stack.push(first_num + second_num); break; case '-': num_stack.push(first_num - second_num); break; case '*': num_stack.push(first_num * second_num); break; case '/': num_stack.push(first_num / second_num); break; } } // 比当前运算符优先级高的运算符 都操作完了 // 再对当前运算入栈 op_stack.push(input[i]); } } printf("%.2lf\n", num_stack.top()); } }