7-4 求前缀表达式的值 (25 分) 数据结构

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:

输入在一行内给出不超过30个字符的前缀表达式,只包含+-*/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:

输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR

输入样例:

+ + 2 * 3 - 7 4 / 8 4

结尾无空行

输出样例:

13.0

结尾无空行

方式:利用堆栈,实现前缀表达式的运算

1.   因为不同对象(运算数、运算符号)之间以空格分隔。而且输入只有一行,所以可以先用string把每一项读入并入栈(可以先命名为S    stack<string> S;)

2.   所有项都读入完之后,开始访问每一个S栈顶元素

(1)如果 S栈顶是数字,就把该元素转成double类型,再压入新的栈中(可以先命名为D stack<double> D;

(2)如果S栈顶是字符(也就是4个运算符号),就访问D栈顶中的两个元素,并出栈,然后根据运算符号的意思进行相应的运算,再把运算的结果再压到栈D中。

(3)最后栈D中剩下的最后一个就是求的结果。

注意!!!

(1)数字不止有一位,可以是多位数。

(2)数字也可以是小数

(3)数字前面可能带正负号

(4)当除数为0的时候要返回 ERROR

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int flag=1;
    string a;
    stack<string> d;
    stack<double> b;

    while (cin >> a) d.push(a);//入栈
     while(!d.empty())
     {
         a=d.top();
         if (a.size() == 1)
        {
            if (a[0] >= '0' && a[0] <= '9')//一位数的时候
            {
                b.push(a[0] - '0');
            }
            else    //栈顶是4个运算符号的时候
            {
                  double s=b.top();
                  b.pop();
                  double k=b.top();
                  b.pop();
                if(a[0]=='-') b.push(s-k);
                else if(a[0]=='+') b.push(s+k);
                else if(a[0]=='*') b.push(s*k);
                else if(a[0]=='/'){
                if(k==0) {flag=0;break;}else b.push(s/k);
                }
                //cout<<'('<<s<<','<<k<<')'<<b.top()<<endl;
            }
        }
        else
        {
            if (a[0] >= '0' && a[0] <= '9')//多位数、小数的时候
            {
                b.push(stod(a));      //stod()函数把string转成double
            }
            else//带正负号的时候
            {
                string p = a;
                a.erase(0, 1);
                if (p[0] == '-')
                {
                    double k = 0 - (stod(a));
                    b.push(k);
                }
                else
                {
                    b.push(stod(a));
                }
            }
        }
        d.pop();
     }
        
    if(!flag) cout<<"ERROR";
    else printf("%.1lf",b.top());
    return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值