py栈、自定义队列、双向队列的实现

480 阅读1分钟

python 的列表就帮我们实现了栈

  • 栈的创建:即创建列表
  • 栈的销毁:即销毁列表对象
    • del list
  • 栈的清空:即清空列表中所有的元素
    • list.clear()
  • 入栈: 即添加元素
    • list.appedn(元素)
  • 出栈:即删除元素
    • list.pop()

这里主要来说用两个栈实现自定义队列和用deque类实现双向队列

  • 自定义队列思路
    1.一个栈作为头部出队,一个栈作为尾部入队
    2.当头部栈为空时,头部和尾部栈互换

代码实现:

class MyQueue:
    def __init__(self):
        self.in_stack = []  # 尾部
        self.out_stack = [] # 头部
    def __len__(self):
        return len(self.in_stack) + len(self.out_stack)
    def push(self,element):
        self.in_stack.append(element)
    def pop(self):
        if not self.out_stack:
            self.out_stack = self.in_stack[::-1]
            self.in_stack = []
        return self.out_stack.pop()
my_queue = MyQueue()
my_queue.push(20)
print(len(my_queue))  # 1
print(my_queue.pop()) # 20
  • deque 类实现双向队列 创建固定大小队列 如过超出范围,旧的值就会消失掉 d = deque(maxlen=n) 代码实现
from collections import deque
# 创建一个固定大小双向队列 d1
d1 = deque(maxlen=5)
# 创建一个非固定大小双向队列 d2
d2 = deque()

关于双向队列的方法

  • append() 右入队
  • appendleft() 左入队
  • pop() 右出队
  • popleft() 左出队
  • count(ele) 统计 元素 ele 的个数
  • reverse() 队列反转
  • extend() 右扩展
  • extendleft() 左扩展

扩展注意事项:右扩展和列表一样,左扩展 是反过来后合并扩展 代码实例

d = deque(maxlen=5)
d.extend([1,2,3])
print(d)
d.extendleft([4,5])
print(d)
结果
deque([1, 2, 3], maxlen=5)
deque([5, 4, 1, 2, 3], maxlen=5)