• HDU 1237 简单计算器 栈


        额,题目是中文的,题意就不用说了= =都看懂喽。写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就好了。然后,就想到了栈的思想了,写两个栈一个存符号一个存数字,如果是加减号留在栈里,如果是乘除号就直接运算完,符号不再入栈,数字直接得出结果再存入,这样第一遍循环过后就只剩下加减法了,不过这时候还不能直接算,因为栈里再出来的话是反的= =所以再写两个栈出来,把之前的内容反过来再运算就能得到结果了。

        表示一开始代码写乱了,然后乘法加法什么的混一块看的麻烦,懒得改所以又重写了一遍= =这一次写加上了注释,清楚多了,看来写注释很关键啊,至少改的时候好找位置......

        下面AC代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<stack>
    using namespace std;
    char s[205];
    stack<double>ds;
    stack<char>mj;
    stack<double>zs;
    stack<char>hj;
    
    int main()
    {
        int len;
        int i,j;
        int sig;
        double a,b;
        double sum;
        char c;
        while(1)
        {
            gets(s);
            if(strcmp(s,"0")==0)
                break;
            len=strlen(s);
            for(i=0;i<len;i++)
            {
                if(s[i]==' ')
                    continue;
                //如果是加减法的话,先放进去,等着
                else if(s[i]=='+'||s[i]=='-')
                {
                    mj.push(s[i]);
                }
                //如果是乘除法的话,拉出前一个数进行计算
                else if(s[i]=='*'||s[i]=='/')
                {
                    if(s[i]=='*')
                        sig=3;
                    else
                        sig=4;
                    a=ds.top();
                    ds.pop();
                    b=0;
                    for(i=i+2;i<len;i++)
                    {
                        if(s[i]==' ')
                            break;
                        b=b*10+(s[i]-'0');
                    }
                    if(sig==3)
                    {
                        a=a*b;
                        ds.push(a);
                    }
                    else
                    {
                        a=a/b;
                        ds.push(a);
                    }
                }
                else if(s[i]>='0'&&s[i]<='9')
                {
                    a=0;
                    for(;i<len;i++)
                    {
                        if(s[i]==' ')
                            break;
                        a=a*10+(s[i]-'0');
                    }
                    ds.push(a);
                }
            }
            //如果还有没进行计算的数,进行一下计算
            while(!ds.empty())
            {
                a=ds.top();
                ds.pop();
                zs.push(a);
            }
            while(!mj.empty())
            {
                c=mj.top();
                mj.pop();
                hj.push(c);
            }
            sum=zs.top();
            zs.pop();
            while(!hj.empty())
            {
                c=hj.top();
                hj.pop();
                a=zs.top();
                zs.pop();
                if(c=='+')
                    sum=sum+a;
                else
                    sum=sum-a;
            }
            printf("%.2f
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    动手动脑2
    假期第五周学习记录
    假期第四周学习记录
    假期第三周学习记录
    假期第二周学习记录
    执行$JAVA_HOME/bin/java -version和java -version命令输出结果不一致
    假期第一周学习记录
    使用VMware创建虚拟机并下载linux系统镜像文件
    VMware Worstation下载安装
    第十七周学习进度
  • 原文地址:https://www.cnblogs.com/lmhbk/p/5784246.html
Copyright © 2020-2023  润新知