简单计算器问题

梦想的初衷 提交于 2019-11-29 13:45:13

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

回答:

#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!='\0')
        {
            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\n",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;
    }
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!