首页 > 代码库 > [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 2442+1442)
[ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习。
首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个阶段再去探究具体的实现,以及对基本结构的改造!
C++标准库中
这里记录一个经典的关于栈和队列的面试题目:
题目:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。
思路:重点是getMin()函数的设计,普通思路是设计一个额外的整形变量用来保存最小值的索引值,每次入栈的时候都讲最小值与入栈值比较,若更小则更新。
误区:此思路的一个非常关键的思考误区在于,没有考虑出栈情况下,如果恰好是该最小值出栈,那么之后就无法获取最小值了!
进一步思考:就是需要将整个过程中的最小值都保存下来,设置一个额外的栈来保存依次获取的最小值,这样即使当前的最小值出栈了,那么次小的值会变成最小值,仍然在辅助栈的栈顶。
误区:再思考一下此设计的过程,如果依次入栈递增的一个序列,比如3,4,5,6,7,那么在辅助栈中却只能记录下3作为最小值保存,那么直接使用getMin后3就出栈了,那么辅助栈中却没有了最小值的信息了!
再进一步:需要解决此漏洞,可以采用:
1、辅助栈中不仅仅保存最小值备份,而是保存一份原始数据的排列顺序的所有值得副本,只有这样在getMin一次后才不至于丢失最小值信息。
2、使用辅助栈,首先要明确栈是先入后出的结构,对于3,4,5这个栈结构,无法直接出栈3或者4,必须先出栈5才可以!!!
所以辅助栈要随数据栈同时出栈或进栈就不用直接排序保存所有数据了,可以按照以下思路:(参考自这里)
拓展:
实现一个队列,带有出队(deQueue),入队(enQueue),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都尽可能小。
[ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 2442+1442)