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;
    }
  • 相关阅读:
    面向过程编程
    生成器
    迭代器
    装饰器
    函数对象与闭包
    名称空间和作用域
    Django中的as_view方法源码分析
    DRF3序列化反序列化
    DRF4级联与外键字段
    django--BBS项目,后端业务逻辑整理
  • 原文地址:https://www.cnblogs.com/czc1999/p/10351970.html
Copyright © 2011-2022 走看看