坑了老子半天,结果是 float 范围不够!!!
基本思想:
- 开一个符号栈,一个数字栈;
- 碰到数字就入栈,碰到符号就与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算,并将结果压回数字栈;
- 如果当前符号优先级大于栈顶符号,再将当前符号入栈。
关于优先级,* / 比 + - 高是没得说的,然后规定两个*号(包括/号),前面的优先级更大。当然会造成一些问题(如:5 / 3 * 3会得出一个小数),但这是没办法的。
符号栈初始放置一个‘#’,并规定 ‘#’,优先级低于任何符号。
表达式求值是老问题了,但是之前做的也不太完善,很多小地方还是没注意到,WA了好几次。 1. 终止条件,if (s.length() == 1 && s[0] == '0') break; 否则 0 + 1,类似的就不会计算了。
2. 题目只说了小数,真是没想到中间运算float范围还会超
完整代码:
#include <stdio.h> #include <string> #include <algorithm> #include <stack> using namespace std; stack<char>symbol; stack<double>num; double operation(char c) { double y = num.top(); num.pop(); double x = num.top(); num.pop(); switch (c) { case '+': return x + y; case '-': return x - y; case '*': return x * y; case '/': return x / y; } } int judge(char stackTop, char now) { switch (now) { case '+': case '-': if (stackTop == '#') return 0; return 1; break; case '*': case '/': if (stackTop == '#' || stackTop == '+' || stackTop == '-') return 0; return 1; break; } } int main() { symbol.push('#'); string s; int d,t; while (scanf("%d",&d)) { char c = getchar(); if (d == 0 && c == ' ') break; num.push(d); while (scanf("%c %d", &c, &t)) { while (judge(symbol.top(), c)) { num.push(operation(symbol.top())); symbol.pop(); } num.push(t); symbol.push(c); if ((c = getchar() == ' ')) break; } while (symbol.top() != '#') { num.push(operation(symbol.top())); symbol.pop(); } printf("%.2lf ", num.top()); num.pop(); } return 0; }