随手练——HDU 1237 表达式求值(输入格式典型)

 

坑了老子半天,结果是 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 == '\n')   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() == '\n'))  break;
        }
        while (symbol.top() != '#') {
            num.push(operation(symbol.top()));
            symbol.pop();
        }
        printf("%.2lf\n", num.top());
        num.pop();
    }
    return 0;
}

 

posted @ 2019-02-04 18:18  czc1999  阅读(148)  评论(0编辑  收藏  举报