[Data Structure]07.栈的应用

国庆假期过完了,今天是假后的第一节数据结构课,内容虽然不多但都是都很精悍。今天主要是接着之前的内容讲了一下栈的应用。众所周知,栈是FILO的,由这个特性,可以产生多种应用。我应该不会都写成代码,但是原理都还是要弄清楚。

1、汉诺塔问题
我高中的时候就看过这个问题,感觉它间接促成了我放弃NOIP竞赛——我发现我太菜了。那个时候我不能理解递归recursion,就不太理解这个问题是怎样被解决的。我在CSDN上看了一位大佬写的心得,解析非常清晰,指路->汉诺塔的图解递归算法

简而言之,对于三个柱子ABC,不要在意是怎么移动到B的,就像这位大佬所揭示的“留给比自己小的盘去做这些工作了”。于是把第n个盘移动到C,需要把n-1个盘从A移动到B,这一部分通过递归完成后,再将B的n-1个盘子全部移动到C,这一部分也会用到递归。直接附上递归函数的代码片段:

 void hanoi(int discs,Stack fromPole, Stack toPole, Stack aux){
	Discs d;
	if( discs >= 1) {
		hanoi(discs-1, fromPole, aux, toPole);
		d = fromPole.pop();
		toPole.push(d);
		hanoi(discs-1,aux, toPole, fromPole);
	}

调用hanoi函数:

void solve(int n, Pole start, Pole end, Pole use){
	if(n == 0) return;
	hanoi(n-1,start, use, end);
	move(start, end);
	hanoi(n-1,use, end, start);
}

2.RPN(逆波兰算法)问题
逆波兰表达式又叫做后缀表达式。一般的,二元运算符(operator)总是放在与他相关的两个运算对象(operand)之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示式。下图中的INFIX是中缀式,RPN是后缀。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值