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

  • 相关阅读:
    添加或删除项并动态记录项的值
    练习题。对DOM中document的深刻理解巩固
    document--文档中的操作,操作属性、操作样式、操作元素
    10.13DOM中document--文档1找到元素的方法,还有元素内容属性
    函数的定义,语法,二维数组,几个练习题
    10.11讲的内容总结
    js基础巩固练习
    10.9做的一个静态页面(巩固前面的内容)
    9.29学习的js基础
    9.28做的作业(企业名称静态网页)
  • 原文地址:https://www.cnblogs.com/benchao/p/4480838.html
Copyright © 2011-2022 走看看