随手练——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\n", num.top());
        num.pop();
    }
    return 0;
}

重新精简了一下代码:

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

原文地址:https://www.cnblogs.com/czc1999/p/10351970.html

时间: 2024-09-30 21:51:21

随手练——HDU 1237 表达式求值(输入格式典型)的相关文章

hdu 4192(表达式求值)

题意:给一个表达式当中有一些变量,然后告诉你一些数字你可以任意排列,问能不能求出要求的结果. 思路:由于变量数目较小所以直接全排列枚举即可,然后用栈处理表达式. 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 21:50 5

四则运算表达式求值 OpenJ_Bailian - 4132

四则运算表达式求值 OpenJ_Bailian - 4132 题意:设计一个计算器,实现+-*/以及()的表达式运算求值. 栈的应用,这学期学数据结构,手写了栈练一下~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10010; //最大表达式长度 4 5 template <typename T> 6 class Stack; 7 8 template <typename T> 9

表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,近期又学会了一些简单的函数求值,比方,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 如果表达式能够简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 假设 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x

四则运算表达式求值の各种心碎

实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一个中缀表达式,回车表示结束. 请输入表达式: 输入一个中缀表达式 输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后 缀表达式中两相邻操作数之间利用空格隔开:如果不正确,在字符界面上输出表达式错误提示. 逆波兰表达式为: 输出逆波兰表达式 运算结果为:输出运算后的结果 测试数据

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现.实现和原理讲解有一点不同,需要进一步进行细化. 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止. 上面的规则转换成下面的执行规则: 1.遇到操作数:直接输出(添加到后缀

【足迹C++primer】表达式求值

表达式求值 /** * 功能:表达式求值(0到9) * 时间:2014年6月15日08:02:31 * 作者:cutter_point */ #include<stdlib.h> #include<stack> #include<iostream> #include<string> using namespace std; stack<int> intStack; //存放数值的栈 stack<char> charStack; //存

NYOJ表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2/4=",程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以"

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei