【数据结构】【拓展题】【02】逆波兰式计算

栈的三大应用例题:

(1)逆波兰式:一个数字栈

链接:(63条消息) 【数据结构】NOJ008—逆波兰式_杨的博客-CSDN博客

(2)中缀表达式计算:一个数字栈和一个运算符栈

链接:(63条消息) 【数据结构】【拓展题】【01】中缀表达式计算_杨的博客-CSDN博客

(3)逆波兰式计算:一个数字栈

链接:(63条消息) 【数据结构】【拓展题】【02】逆波兰式计算_杨的博客-CSDN博客

题目简述:

输入一个逆波兰式,输出其计算结果。同时需注意,所有的数字均是一位数。

输入:
1231+*+
输出:
9

输入:
123*+34*+
输出:
19

解析:

也是经典的利用栈解决问题,其实不难。

只需要一个栈。遇到数字就将它压入栈,遇到一个运算符,说明此时需要计算,且必然是最前面两个数据,就直接拿出栈顶前两个元素计算即可。然后将计算结果入栈。记得刚刚用过的两个都要出栈。最后栈里只剩一个计算结果。

重点:

理清思路,其实很简单。

代码:

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<stack>
using namespace std;

void Calculate_Expr(string str,int len,stack<int>stk)
{
    for(int i=0;i<len;i++)
    {
        if(isdigit(str[i]))
            stk.push(int(str[i]-'0'));
        else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
        {
            int t1,t2;
            t1=stk.top();
            stk.pop();
            t2=stk.top();
            stk.pop();
            if(str[i]=='+')
                stk.push(t1+t2);
            else if(str[i]=='-')
                stk.push(t1-t2);
            else if(str[i]=='*')
                stk.push(t1*t2);
            else if(str[i]=='/')
                stk.push(t1/t2);
            else
                cout<<"运算符错误"<<endl;
        }
        else
        {
            cout<<"表达式有误"<<endl;
            return;
        }
    }

    if(!stk.empty())
        cout<<stk.top()<<endl;
    else
        cout<<"无结果,计算出错!"<<endl;
}
int main()
{
    stack<int>stk;
    while(!stk.empty())
        stk.pop();
    string str;
    cin>>str;
    int len=str.size();
    Calculate_Expr(str,len,stk);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值