• 堆栈
  • 队列

堆栈

特点:LIPO,后进先出
操作:

  • 推Push:将项添加到堆栈的顶部,隐藏堆栈上已经存在的任何项
  • Pop:从堆栈顶部移除一个项目,并将此值返回给调用者
  • peak:返回栈顶元素

堆栈既可以用数组,也可以用链表来实现。

对于python,没有LinkedList这种基本数据结构,需要重新实现。
可以用List方便地实现stack。

stack List
Push append
Pop pop() # 默认index=-1
Peak list[-1]

注:我们把List最后一个元素作为栈顶元素。因为这样数组操作都是O(1)。

  1. class ArrayStack(object):
  2. # 数组实现堆栈
  3. def __init__(self):
  4. self._data = []
  5. def __len__(self):
  6. return len(self._data)
  7. def is_empty(self):
  8. return len(self._data) == 0
  9. # O(1)
  10. def push(self, element):
  11. self._data.append(element)
  12. # O(1)
  13. def top(self):
  14. if self.is_empty():
  15. raise ValueError(' Stack is empty! ' )
  16. return self._data.pop()
  17. # O(1)
  18. def pop(self):
  19. if self.is_empty():
  20. raise ValueError(' Stack is empty! ' )
  21. return self._data.pop()
  22. def printStack(self):
  23. for i in range(len(self._data)):
  24. print(self._data[i], end = ' ')
  25. print()

队列

  • 先进先出(FIFO)
  • 操作
    • Enqueue(insert):将一个项目添加到队列的末尾
    • Dequeue(remove):从队列前面移除一个项目

队列可以通过循环数组或链表轻松实现

  1. class ArrayQueue:
  2. DEFAULT_CAPACITY = 10
  3. def __init__(self):
  4. self._data = [None] * ArrayQueue.DEFAULT_CAPACITY
  5. self._size = 0
  6. self._front = 0
  7. def __len__(self):
  8. return self._size
  9. def is_empty(self):
  10. return self._size == 0
  11. def first(self):
  12. if self.is_empty():
  13. raise ValueError( 'Queue is empty' )
  14. return Self._data[self._front]
  15. def dequeue(self):
  16. if self.is_empty():
  17. raise ValueError( 'Queue is empty' )
  18. answer = self._data[self._front]
  19. self._data[self._front] = None
  20. self._front = (self._front + 1) % len(self._data)
  21. self._size -= 1
  22. return answer
  23. def enqueue(self, e):
  24. if self._size == len(self._data):
  25. self._resize(2 * len(self._data))
  26. pos = (self._front + self._size) % len(self._data)
  27. self._data[pos] = e
  28. self._size += 1
  29. def resize(self, cap):
  30. old = self._data
  31. self._data = [None] * cap
  32. walk = self._front
  33. for k in range(self._size):
  34. self._data[k] = old[walk]
  35. walk = (1 + walk) % len(old)
  36. self._front = 0
  37. def printQueue(self):
  38. for i in range(self._size):
  39. pos = (self._front + self._size - 1 - i) % len(self._data)
  40. print(self._data[pos], end = ' ')
  41. print()

python内置的堆栈和队列

from collections import deque

可以理解为双端队列,支持堆栈和队列的操作。deque = stack + queue
image.png
支持操作:

  • append
  • appendleft
  • pop
  • popleft

题目练习

1.使用堆栈实现队列
两个堆栈。一个堆栈进行push,一个堆栈进行pop。当pop堆栈为空,把push的堆栈所有元素压入用于pop的堆栈。

2.使用队列实现堆栈

3.最小栈
image.png
进一步对存储空间进行优化
image.png

4.一个数组实现两个stack
stack1往前;stack2往后。

5.一个数组实现三个stack
一个数组分成三个空间使用。
空间上不连续 ,用链表优化

6.堆栈排序
额外使用一个stack,画一画就知道。
image.png