栈的经典例题——逆波兰表达式

 题目

题目分析及算法原理

        逆波兰表达式又被称为后缀表达式,想要弄清楚题目意思,首先就要明白什么是后缀表达式。它的核心原理就是把操作符放在两个操作数的后面。想要求出逆波兰表达式的值,我们需要利用栈来模拟整个流程。遇到数,就直接进栈;遇到操作符,弹出两个栈顶元素,计算之后再放入栈中。由于题目中每个数字之间用 '.' 来分隔,并且以 ‘@’ 作为结束标志,所以我们一个字符一个字符的读入。这里需要注意一个细节,比如我们把129这个数字当成一个字符串来看的时候,如何通过遍历字符1、字符2和字符9把这个数字还原出来?我们先定义一个变量num,让其初始化为0,当遍历到1的时候,让 num = 0×10 + 1,此时num值为1,当遍历2的时候,再让num = 1 × 10 + 2,同理操作下去就可以让num = 129。

参考代码

#include <iostream>
#include <stack>
using namespace std;

int main()
{
	stack<int> st;
	int num = 0;
	char ch = 0;
	while(cin >> ch)
	{
		if(ch == '@')
		{
			break;			
		}
		else if(ch >= '0' && ch <= '9')
		{
			num = num * 10 + ch - '0';
		}
		else if(ch == '.')
		{
			st.push(num);
			num = 0;
		}
		else
		{
			int b = st.top();
			st.pop();
			
			int a = st.top();
			st.pop();
			
			if(ch == '+')
			{
				st.push(a + b);
			}
			else if(ch == '-')
			{
				st.push(a - b);
			}
			else if(ch == '*')
			{
				st.push(a * b);
			}
			else
			{
				st.push(a / b);
			}
		}
	}
	cout << st.top() << endl;
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值