算法03_栈、队列

文章目录

      • 1,概念
      • 2,底层数据结构
      • 3,题目
        • 1. 如何实现一个栈,除了提供栈的基本操作外,还提供一个获取栈中最小元素的方法getMin(),要求此方法的时间复杂度为O(1)。
        • 2. 如何只通过栈来实现队列?
        • 3. 如何只通过队列来实现栈?

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队列变成数据队列继续。

你可能感兴趣的:(算法)