• HDU 1237 简单计算器(栈)


    题目链接

    Problem Description
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
    Input
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
     
    Output
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
    Sample Input
    1 + 2
    4 + 2 * 5 - 7 / 11
    0
     
    Sample Output
    3.00
    13.36
     
    题解:本题是栈的使用,因为没有括号,所以不需要中缀转后缀,直接开两个栈,分别存储数字与符号。
    压栈要分情况考虑:①如果读取到的是‘+’或者‘-’,看上一个符号(栈的top,不看输入,因为乘除直接处理掉,在后面看来就没了)是什么,如果没有符号(即空栈),那么当前符号压栈;否则,栈中取出一个符号和两个数字,计算后压栈,当前符号也压栈;②如果读取到‘*’或‘/’,什么也不干(如果使用字符串,那么需要把符号另外保存起来,我的代码不会覆盖所以不另保存)。③如果读取到数字,如果上一个符号是‘*’或‘/’(②在这里用到),则进行计算,结果入栈,如果不是,入栈。最后如果符号栈不空,就每次取一个符号两个数字,相应计算(只有加减)后结果入栈,结束后(符号栈空),数字栈顶就是答案。
    #include <cstdio>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <cstring>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #include <map>
    #define PI acos(-1.0)
    #define ms(a) memset(a,0,sizeof(a))
    #define msp memset(mp,0,sizeof(mp))
    #define msv memset(vis,0,sizeof(vis))
    using namespace std;
    //#define LOCAL
    int main()
    {
    #ifdef LOCAL
        freopen("in.txt", "r", stdin);
    #endif // LOCAL
        ios::sync_with_stdio(false);
        string s;
        bool flag;
        while(getline(cin,s))
        {
            if(s.size()==1)break;
            flag=1;//numric
            stringstream ss(s);
            double num;
            char op='#';
            stack<char> sop;
            stack<double> snum;
            while(!sop.empty())sop.pop();
            while(!snum.empty())snum.pop();
            while(1)
            {
                if(flag)
                {
                    ss>>num;
                    if(op=='*'||op=='/')
                    {
                        double num1=snum.top();
                        snum.pop();
                        if(op=='*')num1=num*num1;
                        else num1=num1/num;
                        snum.push(num1);
                    }
                    else snum.push(num);
                    flag=0;
                }
                else
                {
                    if(ss>>op);
                    else break;
                    if(op=='+'||op=='-')
                    {
                        double num1,num2;
                        char c;
                        if(!sop.empty())
                        {
                            c=sop.top(),sop.pop();
                            num2=snum.top(),snum.pop();
                            num1=snum.top(),snum.pop();
                            if(c=='+')num1+=num2;
                            else num1-=num2;
                            snum.push(num1);
                        }
                        sop.push(op);
                    }
                    flag=1;
                }
            }
            while(!sop.empty())
            {
                op=sop.top(),sop.pop();
                double num1,num2;
                num2=snum.top(),snum.pop();
                num1=snum.top(),snum.pop();
                if(op=='+')num1+=num2;
                else num1-=num2;
                snum.push(num1);
            }
            printf("%.2lf
    ",snum.top());
        }
        return 0;
    }
     
  • 相关阅读:
    fidller 打断点
    随笔
    HTML标签介绍
    补充9.27----9.28
    html5_______9.26
    9.14
    9.13笔记
    9.12笔记
    CSS样式的引用
    html5_______9.10
  • 原文地址:https://www.cnblogs.com/gpsx/p/5183214.html
Copyright © 2020-2023  润新知