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

Posted czc1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随手练——HDU 1237 表达式求值(输入格式典型)相关的知识,希望对你有一定的参考价值。

技术图片

 

坑了老子半天,结果是 float 范围不够!!!

 

基本思想:

将当前符号与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算,继续和当前栈顶符号比较,直到当前符号优先级大于栈顶符号,再将当前元素入栈。

符号栈初始放置一个‘#’,并规定 ‘#’,优先级低于任何符号。

表达式求值是老问题了,但是之前做的也不太完善,很多小地方还是没注意到,WA了好几次。

1. 终止条件,if (s.length() == 1 && s[0] == 0) break; 否则0+1,类似的就不会计算了。
2. 题目只说了小数,真是没想到中间运算float范围还会超

 

 写的很乱,一直不知道哪里错了,还把别人AC代码拿来做了个对数器,也没发现自己哪儿错了,改来改去,先这样放着吧,过两天再精简下。

完整代码:

技术图片
#include<stdio.h>
#include <string>
#include <algorithm>
#include <iostream>
#include <stack>

using namespace std;

double operation(double x, char c, double y) {
    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() {
    stack<char>symbol;
    stack<double>num;
    symbol.push(#);
    string s;
    while (getline(cin, s)) {
        if (s.length() == 1 && s[0] == 0) break;
        s.erase(remove(s.begin(), s.end(),  ), s.end());
        for (int i = 0; i < s.length(); i++) {
            int t = 0;
            if (s[i] >= 0&&s[i] <= 9) {
                while (s[i] >= 0&&s[i] <= 9) {
                    t = t*10+(s[i]-0);
                    i++;
                }
                num.push(t);
            }
            if (i >= s.length())break;
            while (judge(symbol.top(), s[i])) {
                char c = symbol.top();
                symbol.pop();
                double y = num.top(); num.pop();
                double x = num.top(); num.pop();
                num.push(operation(x, c, y));
            }
            symbol.push(s[i]);
        }

        while (symbol.top() != #) {
            char c = symbol.top();
            symbol.pop();
            double y = num.top(); num.pop();
            double x = num.top(); num.pop();
            num.push(operation(x, c, y));
        }
        printf("%.2lf
", num.top());
        num.pop();
    }
    return 0;
}
View Code

 重新精简了一下代码:

#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;
}

 


以上是关于随手练——HDU 1237 表达式求值(输入格式典型)的主要内容,如果未能解决你的问题,请参考以下文章

C - 简单计算器 (HDU - 1237)

HDU 1237 简单计算器

随手练——数独 HDU - 5547 坑!坑!坑!

随手练——HDU-2037 时间安排(贪心)

HDU 1237 简单计算器(栈)

HDU1237--简单计算器(栈的应用)