狛 枝 凪 斗
2022-02-17 22:56
采纳率: 80%
浏览 19

关于用栈实现简易计算器 我的代码错在哪里?

问题遇到的现象和发生背景

进行两个数字之间的运算没有问题,如1 + 1,1 * 1,但是设计第三个数字,如1 + 1 + 1,就会没有输出结果就结束运行。

问题相关代码,请勿粘贴截图
#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<stack>

using namespace std;

void deal(char c,stack<double>&num){
    double f1,f2;
    f2=num.top();
    num.pop();
    f1=num.top();
    num.pop();
    //栈后进先出 所以先出来的是f2
    double ans;
    if(c=='+')ans=f1+f2;
    if(c=='-')ans=f1-f2;
    if(c=='*')ans=f1*f2;
    if(c=='/')ans=f1/f2;
    num.push(ans);
}

int main(){
    string s;
    while(getline(cin,s),s!="0"){//双引号 不是单引号
    //式子中间可能有空格 不能用cin要用getline
        stack<double>num;
        stack<char>op;
        map<char,int>mp;
        mp['+']=mp['-']=1;
        mp['*']=mp['/']=2;
        double now=0;
        int i;
        for(i=0;i<=s.size();i++){
            if(s[i]>='0'&&s[i]<='9'){
                now=now*10+(s[i]-'0');
            }else if(i==s.size()){
                num.push(now);
            }else if(s[i]=='+'||s[i]=='*'||s[i]=='-'||s[i]=='/'){
                num.push(now);
                now=0;
                if(!op.empty()){
                //用top前必须判断非空!!!
                    while(mp[s[i]]<=mp[op.top()]&&(!op.empty())){
                        deal(op.top(),num);
                        op.pop();
                    }
                }
                op.push(s[i]);
            }//else if(s[i]==' ')continue;
        }
        while(!op.empty()){
            deal(op.top(),num);
            op.pop();
        }
        printf("%.2f\n",num.top());
    }
    return 0;
}


2条回答 默认 最新

相关推荐 更多相似问题