RPN(逆波兰式)STL的stack实现超简超详细


1.什么叫RPN(逆波兰式)

逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)。

示例:我们平时写a + b,这是中缀表达式,写成后缀表达式就是:a b +

2.逆波兰式怎么用stack实现

(1)储存方式

很显然,逆波兰式的 1 2 + 格式需要我们将数字与计算符号分隔开,
这里我们使用stack

stack<int> c1;

(2)辨别数字与运算符

知道使用stack进行储存那么该如何辨别数字与运算符呢?
我们可以采用ascII码进行辨别

代码如下(示例):

if(str.back()>='0'&&str.back()<='9')

(3)类型转换

输入只有一行,包括数字和运算符(+, -, , /)我们输入时为字符,故想要能够计算需要转换为int,则可以用stoi函数
代码如下(示例):

int num = stoi(str);

(4)计算方式

当判断为字符时,数字出栈与当前符号计算,计算结果入栈

 else
        {
        int y = c1.top();
        c1.pop();
        int x = c1.top();
        c1.pop();
            if(str =="+") c1.push(x+y);
            if(str =="-") c1.push(x-y);
            if(str =="*") c1.push(x*y);
            if(str =="/") c1.push(x/y);

        }

3.具体操作

伪代码

(注意这里使用EOF终止,如果想代码辨别输入完成可以自己加判断条件)

while(输入)
{
if(判断是否为数字)
{
是则入栈
}
else
栈顶及栈上一位 出栈,出栈与当前符号计算,计算结果入栈

}
while终止输出最后结果

4.具体代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    stack<int> c1;
    string str;
    while (cin>>str)
    {
        if(str.back()>='0'&&str.back()<='9')
        {
            int num = stoi(str);
            c1.push(num);
        }
        else
        {
        int y = c1.top();
        c1.pop();
        int x = c1.top();
        c1.pop();
            if(str =="+") c1.push(x+y);
            if(str =="-") c1.push(x-y);
            if(str =="*") c1.push(x*y);
            if(str =="/") c1.push(x/y);

        }
    }
    cout<<c1.top();
    return 0;
}

5.如有疑问

欢迎评论留言~


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王也枉不了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值