算法03_栈、队列

1,概念

栈:后进先出(想象一个弹夹、或者桶,后放进去的元素,先被取出来),push、pop
队列:先进先出(排队,先来先服务),add、poll

2,底层数据结构

底层可以用一个双向链表实现栈和队列。
也可以用数组实现(为了简单,可以只考虑容量固定的情况):

  1. 可以用一个数组实现栈:limit,index
  2. 可以用数组,通过循环使用来实现队列(环形缓冲区RingBuffer):limit,count,pushIndex,pullIndex。

3,题目

1. 如何实现一个栈,除了提供栈的基本操作外,还提供一个获取栈中最小元素的方法getMin(),要求此方法的时间复杂度为O(1)。

关键在于getMin()时间复杂度为O(1)。
实现:空间换时间——内部用2个栈来实现。其中一个栈正常push和pop,另外一个栈只push当前状态下的最小值。getMin取第二个栈最顶上的元素(peek操作),即是O(1)时间复杂度的操作。

2. 如何只通过栈来实现队列?

两个栈互相倒腾(腾挪)来实现。
add操作只往其中一个栈进行,一旦需要poll,判断第二个栈如果为空,先将第一个栈中所有元素push到第二栈中,然后从第二个栈pop。

3. 如何只通过队列来实现栈?

两个队列互相倒腾(腾挪)来实现。
push到其中一个队列(叫做数据队列)。
每次需要pop的时候,将当前的数据队列(假设是A)中除最后一个元素外,全部转移到第二个队列(B)中,然后从A队列poll。这样之后,B队列变成数据队列继续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值