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.如有疑问
欢迎评论留言~