codeup 问题 A: 简单计算器(******)

#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <stack>
#include <queue>

using namespace std;
struct node{
    double num;
    char op;
    bool flag;
};
string str;
stack<node>s;
queue<node>q;
map<char,int>op;

void change()
{
    node temp;
    for(int i = 0;i<str.length();)
    {
        if(str[i] <= '9' && str[i] >= '0')
        {
            temp.flag = true;
            temp.num = str[i++] - '0';
            while(str[i] <= '9' && str[i] >= '0' && i<str.length())
            {
                temp.num = temp.num * 10 + (str[i] - '0');
                i++;
            }
            q.push(temp);
        }
        else
        {
            temp.flag = false;
            while(!s.empty() && op[str[i]] <= op[s.top().op])
            {
                q.push(s.top());
                s.pop();
            }
            temp.op = str[i];
            s.push(temp);
            i++;
        }
    }
    while(!s.empty())
    {
        q.push(s.top());
        s.pop();
    }
}

double cal()
{
    node ans,temp;
    double num1,num2;
    while(!q.empty())
    {
        temp = q.front();
        q.pop();
        if(temp.flag == true)
        {
            s.push(temp);
        }
        else
        {
            num2 = s.top().num;
            s.pop();
            num1 = s.top().num;
            s.pop();
            ans.flag = true;
            if(temp.op == '+')
            {
                ans.num = num1 + num2;
            }
            else if(temp.op == '-')
            {
                ans.num = num1 - num2;
            }
            else if(temp.op == '*')
            {
                ans.num = num1 * num2;
            }
            else if(temp.op == '/')
            {
                ans.num = num1 / num2;
            }
            s.push(ans);

        }

    }
    return s.top().num;
}

int main()
{
    op['*'] = op['/'] = 2;
    op['+'] = op['-'] = 1;

    while(getline(cin,str),str != "0")
    {
        while(!s.empty())
            s.pop();
        for(string::iterator it = str.end();it!=str.begin();it--)
        {
            if(*it == ' ')
                str.erase(it);
        }
        change();
//        while(!q.empty())
//        {
//            if(q.front().flag== true)
//                cout<<q.front().num<<endl;
//            else
//                cout<<q.front().op<<endl;
//            q.pop();
//        }
        double ans = cal();
        printf("%.2f\n",ans);
    }


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值