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

题目链接:点击打开链接


题目大意:


解题思路:
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;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/81031823