// 描述 // 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 //输入描述: // 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。 // 没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 // 整数 空格 运算符 //输出描述: // 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 #include "cstdio" #include "string" #include "stack" #include "map" using namespace std; int main() { char buf[1024]; map<char, unsigned> priority = { {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}, }; while (NULL != fgets(buf, sizeof buf, stdin)) { string input = buf; if ('0' == input[0]) { // 这里借用了 最后一个字符\n 来清空 两个stack 从而保证最后的两个栈都被计算完了 没有剩余的数字与操作符 break; } stack<char> op_stack; stack<double> num_stack; string num; // 用来存储字符拼凑出来的数字 // 遍历表达式 for (int i = 0; i < input.length(); ++i) { // 1. 字符读进来的数字 if (input[i] >= '0' && input[i] <= '9') { num.push_back(input[i]); } else if (' ' == input[i]) { // 2. 字符读进来的空格 if (!num.empty()) { num_stack.push(stod(num)); num.clear(); } } else { // 前面的数字字符匹配结束了 if (!num.empty()) { num_stack.push(stod(num)); num.clear(); } // 3. 字符读进来的操作服 + - * / while (!op_stack.empty() && priority[op_stack.top()] >= priority[input[i]]) { char op = op_stack.top(); op_stack.pop(); double num1 = num_stack.top(); num_stack.pop(); double num2 = num_stack.top(); num_stack.pop(); switch (op) { case '+': num_stack.push(num2 + num1); break; case '-': num_stack.push(num2 - num1); break; case '*': num_stack.push(num2 * num1); break; case '/': num_stack.push(num2 / num1); break; } } // 所有优先级大于等于当前运算符的运算都计算完毕 op_stack.push(input[i]); } } while (!num_stack.empty()) { printf("%.2lf\n", num_stack.top()); num_stack.pop(); } // printf("%d\n", op_stack.empty()); } return 0; }