HDU 1237 简单计算器 (栈模拟)

#include <stack>
#include <cstdio>
using namespace std;
const int maxn =200+5;
char s[maxn];
//考虑到 1 - 2 + 2 / 1 = 1.00 的特殊性,将减法转换为加法
int main()
{
    while(gets(s)!=NULL)
    {
        int L=strlen(s);
        if(L==1&&s[0]=='0') break;//仅有1个0时结束循环
        stack<double>q;//数字栈
        stack<char>v;//符号栈
        bool flag=true;//判断当前数字的正负
        double c=0,y;
        for(int i=0; s[i];)
            if(s[i]>='0'&&s[i]<='9')
            {
                c=c*10+s[i]-'0';
                i++;
            }
            else if(s[i]=='+'||s[i]=='-')//每次遇到+,-号直接将c进栈
            {
                if(!flag) q.push(-1*c);//前一个数字为负,下同
                else q.push(c);
                if(s[i]=='-') flag=false;
                else flag=true;
                c=0;
                v.push(s[i]),i++;
            }
            else if(s[i]!=' ')
            {
                char tt=s[i];
                i+=2;
                y=0;
                while(s[i]>='0'&&s[i]<='9'&&i<L) y=y*10+s[i]-'0',i++;//读取下一个数字
                if(tt=='*') c*=y;
                else c/=y;
            }
            else i++;
        //将末尾的运算结果进栈
        if(!flag) q.push(-1*c);
        else q.push(c);
        while(!v.empty())//符号出栈进行加法运算
        {
            char tt=v.top();
            v.pop();
            double x=q.top();
            q.pop();
            double y=q.top();
            q.pop();
            y+=x;
            q.push(y);
        }
        printf("%.2lf\n",q.top());
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值