逆波兰式计算(rpn)---2023市赛小学组T2

题目描述

逆波兰表达式又叫做后缀表达式,是波兰逻辑学家 J.卢卡西维兹于 1929 年 首先提出的一种表达式的表示方法,它把运算数写在前面,把运算符写在后面,逆波兰式中只有运算符和运算数。如 a + b 的逆波兰式为 ab+ ,a + b - c 的逆波兰 式为 ab+c- ,a+( b – c)的逆波兰式为 abc-+ 。现在小可可有一个已知的逆波兰 式,请帮他计算这个逆波兰式的值吧。一种计算逆波兰式值的方法是从左向右扫 描逆波兰式,遇到运算符就计算, 为简化计算, 假设这个逆波兰式中只有+ 、- 两 种运算符。

输入格式

共 2 行。第一行 1 一个正整数 n,表示逆波兰式中数值的个数(包括运算 符和运算数),第二行为逆波兰式,其中每个数值 p 由空格分隔。保证每 个逆波兰式都是正确可计算的。

输出格式

共 1 行 1 个整数,表示逆波兰式的值。

输入输出样例

输入样例1:

5 
10 100 + 13 - 

输出样例1:

97

输入样例2:

5 
10 20 13 - + 

输出样例2:

17

说明

样例解释1: 从左向右扫描, 遇到+,则向前(左) 取两个数 10 和 100,进行 加法运算, 10+100=110,继续向右扫描,遇到- ,则向前 (左) 取两个数 110  和13,进行减法运算,110-13=97

样例解释2: 从左向右扫描, 遇到- ,则向前(左) 取两个数 20 和 13,进行减 法运算, 20-13=7,继续向右扫描, 遇到+,则向前(左) 取两个数 10 和 7,进行 加法运算, 10+7=17

数据范围: 1≤n≤100 ,p 为+ 、-或 1≤p≤100 的整数  

表达式求值即可

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string s;
stack<LL>d;
void fun(string s){
    LL op,opl,opr;
    opr=d.top();d.pop();
    opl=d.top();d.pop();
    if(s=="+")op=opl+opr;
    if(s=="-")op=opl-opr;
    if(s=="*")op=opl*opr;
    if(s=="/")op=opl/opr;
    d.push(op);
}
int main(){
    freopen("rpn.in","r",stdin);
    freopen("rpn.out","w",stdout);
    while(cin>>s){
        if(isdigit(s[0])){
            LL n;
            stringstream sin;
            sin<<s;
            sin>>n;
            d.push(n);
        }else fun(s);
    }
    cout<<d.top();
    return 0;
}

AC!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值