hdu1237 表达式求值--栈

简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24273    Accepted Submission(s): 8794

Problem Description

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input

1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output

3.00
13.36

Source

浙大计算机研究生复试上机考试-2006年

#include <iostream>
#include <stack>
#include <string>
#include <cstdio>
using namespace std;

stack<double> opnd; //运算对象栈
stack<char> optr;   //运算符号栈
void f()            //取栈顶元素运算
{
    double tmp;
    char key=optr.top();
    optr.pop();
    double x=opnd.top();
    opnd.pop();
    double y=opnd.top();
    opnd.pop();
    switch(key)
    {
    case ‘+‘: tmp=x+y;  break;
    case ‘-‘: tmp=y-x;  break;
    case ‘*‘: tmp=x*y;  break;
    case ‘/‘: tmp=y/x;  break;
    }
    opnd.push(tmp);
}
int main()
{
    double a,ans=0;
    char t,b;
    while(scanf("%lf",&a)==1)
    {
        opnd.push(a);
        scanf("%c",&t);
        if(a==0&&t==‘\n‘)           //结束循环
            break;
        while(scanf("%s %lf",&b,&a)==2)
        {
            char ch=getchar();      //读入数字后面的字符
            while(1)
            {
                if(optr.empty()||((b==‘*‘||b==‘/‘)&&(optr.top()==‘+‘||optr.top()==‘-‘)))
                {
                    optr.push(b);           //栈空或下一个运算符优先级更高,入栈
                    opnd.push(a);
                    break;
                }
                else                        //否则取栈顶元素运算然后运算符入栈
                     f();
            }
            if(ch==‘\n‘)                 //输出结果
            {
                while(!optr.empty())
                {
                    f();
                }
                ans=opnd.top();
                printf("%.2lf\n",ans);
                while(!opnd.empty())    //多组测试数据,清空栈
                {
                    opnd.pop();
                }
                while(!optr.empty())
                {
                    optr.pop();
                }
                break;
            }
        }
    }
    return 0;
}

这题至少整了两天,一开始是为了练一练STL,熟悉熟悉应用的,然后发现数据结构教科书上P87的例题写错了,只能进行10以内的加减乘除运算,除法还没法保持精度,然后这题一开始敲的时候就是整体将表达式读入,再处理的,没有注意到题中的每个符号之间都有一个空格,这能很好的简化题目,否则就得考虑字符串转化为数字的处理,手动模拟数字乘位权值;(这里,题目也没给清楚表达式里数字的范围,= =有想到java的大数浮点型)。最后终于AC了。。。

原文地址:https://www.cnblogs.com/Cloud-king/p/8453703.html

时间: 2024-09-30 01:39:36

hdu1237 表达式求值--栈的相关文章

表达式求值 (栈) 用C++实现

1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <cmath> 6 7 #include <stack> 8 9 #include <cstring> 10 11 using namespace std; 12 13 14 15 char Precede(char a, char b) { //判断运算符优先级 16 17 int i, j; 18 19 char Table[8][

表达式求值--栈

用栈的方式,将中缀转为后缀,再进行求值.另外附加括号匹配的方法 1 public class PostfixExpression { 2 3 public static int lastvalue(String str){ //后缀表达式求值,传入空格分割的字符串 4 Stack<Integer> stack = new Stack<Integer>(); 5 String[] data = str.split(" "); 6 7 for(int i = 0;i

Python解析 算数表达式求值 栈的使用

使用Python实现一种算数表达式求值的算法,模拟这种使用栈的方式,这是由E.W.Dijkstra在20世纪60年代发明的一种非常简单的算法.代码模拟仅仅表现一种编程思想,代码的逻辑并不完全: if __name__ == "__main__": cal_str = input("请输入算数表达式(e.g.(((1+2)*(3+5))+2), 只适合简单的算数表达式):") num_stack = [] symbol_stack = [] for chr in ca

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

中缀表达式求后缀,再由后缀表达式求值

人:中缀表达式 计算机:后缀表达式 需要进行中缀转后缀,再计算.无论哪一步都需栈: 对于(3 + 4) × 5 - 6 一 中缀转后缀 涉及的栈用来存储符号如"+ - × / ( )" 思想: 遇见数字输出:遇见符号入栈 当空栈或者符号是左括号时直接入栈 ; 当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈; 当运算符是右括号时,将栈内直到第一个左括号的符号出栈,并输出非括号的符号 算法: //中缀表达式改成后缀表达式 void mid2a

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

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

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

NYOJ35 表达式求值 【栈】

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

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可