数据结构与算法题目集(中文) - 7-21 求前缀表达式的值(25 分)

本文介绍了一种从前缀表达式中计算结果的算法,包括处理double类型的数字及特殊情况如除数为零的情况。使用C++实现了一个完整的程序。

题目链接:点击打开链接

题目大意:

解题思路:
1、前缀表达式的求值:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
2、注意数字可能是 double 类型,遇到 “/”,考虑分母为 “0” 的情况。

AC 代码(支持 double 类型)

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

vector<string> v;
stack<double> sk;

int main()
{
    v.clear();
    while(!sk.empty()) sk.pop();
    string s;
    while(cin>>s) v.push_back(s);

    int len=v.size(),flag=0;
    stringstream ss;
    double num,n1,n2;
    for(int i=len-1;i>=0;i--)
    {
        s=v[i];
        if(s!="+" && s!="-" && s!="*" && s!="/")
        {
            ss.clear(); ss<<s; ss>>num;
            sk.push(num);
            ss.str("");
        }
        else
        {
            n1=sk.top(); sk.pop(); n2=sk.top(); sk.pop();
            if(s=="+")
                sk.push(n1+n2);
            else if(s=="-")
                sk.push(n1-n2);
            else if(s=="*")
                sk.push(n1*n2);
            else if(s=="/")
                if(n2==0){ flag=1; break; }
                else sk.push(n1/n2);
        }
    }
    if(sk.size()!=1 || flag==1)
        puts("ERROR");
    else
        printf("%.1f\n",sk.top());

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆克和他的代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值