简单计算机

题目描述

    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

输入描述:

    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出描述:

    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
示例1

输入

复制
1 + 2
4 + 2 * 5 - 7 / 11
0

输出

复制
3.00

13.36

//题目中的例子是有空格的
#include<iostream>
#include<stack>
#include<string>
using namespace std;
string s;
stack<int>op;//存储运算符的编号.0:= 1:+ 2:- 3:* 4:/
stack<double>in;
int mat[][5]
{
    1,0,0,0,0,
    1,0,0,0,0,
    1,0,0,0,0,
    1,1,1,0,0,
    1,1,1,0,0,
};


void get(bool &retop,int &retnum,int &i)
{
    if(s[i]>='0'&&s[i]<='9')
    {
        retop=false;
        double temp=s[i]-'0';
        for(i++;s[i]>='0'&&s[i]<='9';i++)
        {
             temp=temp*10+s[i]-'0';
        }
        retnum=temp;
        i++;
    }
    else
    {
        retop=true;
        if(s[i]=='#')
            retnum=0;
        else if(s[i]=='+')
            retnum=1;
        else if(s[i]=='-')
            retnum=2;
        else if(s[i]=='*')
            retnum=3;
        else if(s[i]=='/')
            retnum=4;
        i+=2;
    }
}
int main()
{

    while(getline(cin,s))
    {
         bool retop;//返回当前字符是否是运算符,是true 否false;
         int retnum;//如果是运算符返回运算符的编号,否则返回运算数
         int i;//遍历字符串的下标
         s="# "+s+" #";//在添加人为的符号的时候,切记空格
         while(!op.empty())op.pop();
         while(!in.empty())in.pop();
        while(true)
     {
        get(retop,retnum,i);
        if(retop==false)
        {
            in.push((double)retnum);
        }//是数字
        else
        {
            double result;
            if(op.empty()||mat[retnum][op.top()]==1)
            {
                op.push(retnum);
            }
            else
            {
                while(mat[retnum][op.top()]==0)
                {
                    double a=in.top();
                    in.pop();
                    double b=in.top();
                    in.pop();
                    int c=op.top();
                    op.pop();
                    if(c==1)
                        result=a+b;
                    if(c==2)
                        result=b-a;
                    if(c==3)
                        result=a*b;
                    if(c==4)
                        result=b/a;
                    in.push(result);
                }
                op.push(retnum);
            }
        }

        if(op.size()==2&&op.top()==0)
            break;
      }

        printf("%.2lf\n",in.top());
    }
    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_38030194/article/details/80864702
今日推荐