zoukankan      html  css  js  c++  java
  • 简单计算器问题

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

    回答:

    #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;
        }
    }

  • 相关阅读:
    修复 Visual Studio Error “No exports were found that match the constraint”
    RabbitMQ Config
    Entity Framework Extended Library
    Navisworks API 简单二次开发 (自定义工具条)
    NavisWorks Api 简单使用与Gantt
    SQL SERVER 竖表变成横表
    SQL SERVER 多数据导入
    Devexpress GridControl.Export
    mongo DB for C#
    Devexress XPO xpPageSelector 使用
  • 原文地址:https://www.cnblogs.com/benchao/p/4480838.html
Copyright © 2011-2022 走看看