• 简单计算器问题


    问题:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值并写出算法。

    回答:

    #include<iostream>
    #include<stack>
    #include<string>
    using namespace std;
    char Precede(char a,char b);
    double operate(double a1,char c,double b1);
    int main()
    {
        stack<double> opnd;
        stack<char> optr;
        string s;
        char theta,c;
        int i,k;
        double a,b;
        while(getline(cin,s),s!="0")
        {
            opnd.push(s[0]-48);
            i=0;
            c=s[++i];
            while(c!='')
            {
                if(c==' ')
                {
                    c=s[++i];
                    continue;
                }
                if(c>='0'&&c<='9')
                {
                    if(s[i-1]>='0'&&s[i-1]<='9')//此处重要,比如32字符是连续的多个不是单个
                    {
                        a=opnd.top()*10+c-48;
                        opnd.pop();
                        opnd.push(a);
                    }
                    else
                    opnd.push(c-48);
                    c=s[++i];
                }
                else
                {
                    if(optr.empty()!=true)
                    {
                        switch(Precede(optr.top(),c))//重点:运算符的优先级
                        {
                            case '<':optr.push(c);c=s[++i];break;//如果前一个运算符比后一个下就进栈
                            case '>':theta=optr.top();//此处进行运算,并没有进栈,因为我是前面字符和后面字符比较
                                     optr.pop();      //只有前面字符优先级高才运算
                                     a=opnd.top();
                                     opnd.pop();
                                     b=opnd.top();
                                     opnd.pop();
                                     opnd.push(operate(b,theta,a));
                                     break;
                         }
                     }
                    else
                    {
                        optr.push(c);
                        c=s[++i];
                    }
                }
            }
            while(optr.empty()!=true)//因为我先输入数字,可能最后剩下运算符没有处理
            {
                 theta=optr.top();
                 optr.pop();
                 a=opnd.top();
                 opnd.pop();
                 b=opnd.top();
                 opnd.pop();
                 opnd.push(operate(b,theta,a));
            }
            printf("%.2lf ",opnd.top());
        }
        return 0;
    }
    char Precede(char a,char b)//比较运算符的优先级
    {
        if(a=='+'||a=='-')
        {
            switch(b)
            {
                case '+':
                case '-':return '>';break;
                case '*':
                case '/':return '<';break;
            }
        }
        if(a=='*'||a=='/')
        return '>';
    }
    double operate(double a,char c,double b)//运算
    {
        switch(c)
        {
            case '+':return (a+b);break;
            case '-':return (a-b);break;
            case '*':return a*b;break;
            case '/':return a/b;break;
        }
    }

  • 相关阅读:
    模拟手机售电影票
    flex布局
    如何制作快速加载的HTML页面
    css布局列表,自适应
    iOS项目中常见定时器
    iOS中TableView的分割线顶格样式的实现
    iOS本地化项目上传到gitHub
    iOS初学者易懵逼的Timer延时
    iOS同种界面moda和push方式切换
    iOS之push和modal大不同
  • 原文地址:https://www.cnblogs.com/benchao/p/4480838.html
Copyright © 2020-2023  润新知