hdu1237 表达式求值--栈

Posted Akmpfen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
#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了。。。

以上是关于hdu1237 表达式求值--栈的主要内容,如果未能解决你的问题,请参考以下文章

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

HDU 1237 简单计算器(栈)

*HDU 1237 栈

HDU 1237 简单计算器(后缀式+栈)

hdu 1237 简单计算器(栈处理)

HDU1237 简单计算器 栈