zoukankan      html  css  js  c++  java
  • 随手练——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 == '
    ')   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;
    }
  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/czc1999/p/10351970.html
Copyright © 2011-2022 走看看