HDU——1237简单计算器

HDU——1237简单计算器
分析:模拟题,现将一行的字符读入,当遇见数字就放入数子栈,遇见加减放入字符栈,
遇见乘除,将最顶端的数字串和下一个数字进行计算再放入数字栈 _最后将栈里面的元素倒置,进行加减运算,emmm估计队列也可以用的
用stack和对字符串的处理
给的数据也好,每个数字和字符中间都是用空格分开,好判断emmm~

#include<iostream>
#include<cstdio>
#include<stack>
#include<map>
#include<string>
#include<cstring>
using namespace std;
int main()
{
    char s[220];
    while(gets(s),strcmp(s,"0"))
    /*为0结束 ,gets函数可以无限读取以回车为结束  同时strcmp比较两个字符串 
    若str1==str2,则返回零; 若str1<str2,则返回负数; 若str1>str2,
    则返回正数。*/ 
    {
        int len=strlen(s);
        stack<char>sym; 
        stack<double>num;
        for(int i=0;i<len;i++)
        {
            if(s[i]==' ')
                continue;
            else if(s[i]=='*'||s[i]=='/')
            {
                double x=num.top();
                num.pop();
                double y=0;
                int j;
                for(j=i+2;j<len;j++)//此处注意要跳过几个非数字符号 
                {
                    if(s[j]!=' ')
                    y=y*10+s[j]-'0';
                    else
                     break;
                }
                if(s[i]=='*')
                 num.push(x*y);
                else
                  num.push(x/y);
                i=j;

            }//对于乘除直接计算 
            else if(s[i]=='+'||s[i]=='-')
                sym.push(s[i]);
            else
            {
                double ans=0;
                int j;
                for(j=i;j<len;j++)
                {
                    if(s[j]!=' ')
                    ans=ans*10+s[j]-'0';
                    else
                     break;
                }
                i=j;
                num.push(ans);  
            }
        }

        //倒序
        stack<char>dsym; 
        stack<double>dnum;

        while(!sym.empty())
        {
            char e=sym.top();
            //cout<<e<<endl;
            dsym.push(e);
            sym.pop();
        }
        while(!num.empty())
        {
            double e=num.top();
            //cout<<e<<endl;
            dnum.push(e);
            num.pop();
        }
        //进行加减计算 
        while(!dnum.empty()&&!dsym.empty())
        {
            double x=dnum.top();
            dnum.pop();
            double y=dnum.top();
            dnum.pop();
            char e=dsym.top();
            dsym.pop();
            if(e=='+')
              dnum.push(x+y);
            else
              dnum.push(x-y);   
        }
        printf("%.2lf\n",dnum.top());
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值