[python]队列操作(持续更新中)

本文介绍了如何使用链表实现队列和双端队列,并提供了相关操作如is_empty(), length(), push(), pop(), peek()等。队列在满时会抛出错误,双端队列可以从两端添加和移除元素。还展示了Queue和Deque类的实例,演示了它们的基本操作和使用场景。
摘要由CSDN通过智能技术生成

Ctrl+f搜关键词,搜不到找其他博客,下面肯定没有

队列

队列要实现的操作

Queue() 创建一个空的队列

is_empty() 判断一个队列是否为空

length()

push(item) 添加一个元素到队尾

pop() 弹出队头

peek() 获取队头

循环队列
# 队列 -- 链表实现

class Node:
    def __init__(self, data, _next=None):
        self.data = data  # 数据域
        self.next = _next  # 指针域

class Queue:
    def __init__(self, size):
        self.head = None  # 队列的队头
        self.rear = None  # 队列的队尾
        self._length = 0  # 队列的长度
        self.size = size  # 队列的最大长度

    def is_empty(self):
        return self._length == 0

    def length(self):
        return self._length

    def push(self, item):
        # 判断队列是否已满
        if self.length() == self.size:
            raise ValueError('队列已满')
        # 添加一个元素item到队尾
        # 最后一个元素作为队尾
        node = Node(item)
        # 如果队列是空
        if self.is_empty():
            self.head = node
            self.rear = node
        else:
            self.rear.next = node
            self.rear = node
        self._length += 1

    def pop(self):
        # 抛出队首元素
        if self.is_empty():
            raise ValueError('队列是空的')
        value = self.head.data
        self.head = self.head.next
        self._length -= 1
        return value

    def peek(self):
        if self.is_empty():
            raise ValueError('队列是空的')
        return self.head.data


if __name__ == '__main__':
    queue = Queue(3)
    queue.push(1)
    queue.push(2)
    queue.push(3)
    print(queue.pop())  # 1
    queue.push(4)
    print(queue.length())  # 3
    print(queue.peek())  # 2
    print(queue.pop())  # 2
    print(queue.pop())  # 3
    print(queue.pop())  # 4
    # print(queue.pop())

双端队列

Deque() 创建一个空的队列

is_empty() 判断一个队列是否为空

length()

push(item) 添加一个元素到队尾

push_left(item) 添加一个元素到队头

pop() 弹出队头

pop_right() 弹出队尾

peek() 获取队头

class Node:
    def __init__(self, data, _next=None):
        self.data = data  # 数据域
        self.next = _next  # 指针域


class Deque:
    def __init__(self):
        self.head = None  # 队首
        self.rear = None  # 队尾
        self._length = 0  # 队列的长度

    def is_empty(self):
        return self._length == 0

    def length(self):
        return self._length

    def items(self):
        cur = self.head
        while cur:
            print(cur.data, '->', end=' ')
            cur = cur.next
        print()

    def push(self, item):
        # 在队尾添加一个元素item
        node = Node(item)
        # 队列为空
        if self.is_empty():
            self.head = node
            self.rear = node
        # 队列不为空
        else:
            self.rear.next = node
            self.rear = node
        self._length += 1

    def push_left(self, item):
        # 在队首添加一个元素item
        node = Node(item)
        if self.is_empty():
            self.head = node
            self.rear = node
        else:
            node.next = self.head
            self.head = node
        self._length += 1

    def pop(self):
        # 弹出队首元素
        if self.is_empty():
            raise ValueError('双端队列为空')
        value = self.head.data
        self.head = self.head.next
        self._length -= 1
        if self._length == 0:
            self.rear = None
        return value

    def pop_right(self):
        # 弹出队尾元素
        if self.is_empty():
            raise ValueError('双端队列为空')
        if self.length() == 1:
            return self.pop()
        cur = self.head
        value = self.rear.data
        while cur.next != self.rear:
            cur = cur.next
        self.rear = cur
        cur.next = None
        self._length -= 1
        return value

    def peek(self):
        if self.is_empty():
            raise ValueError('双端队列为空')
        return self.head.data


if __name__ == '__main__':
    deque = Deque()
    deque.push(1)  # 1
    deque.push(2)  # 1, 2
    deque.push_left(3)  # 3, 1, 2
    deque.push_left(4)  # 4, 3, 1, 2
    deque.items()
    deque.pop()
    deque.items()
    deque.pop_right()
    deque.items()

常用方法:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回True,反之False
  • Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]])获取队列,timeout等待时间
  • Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
  • Queue.put(item) 写入队列,timeout等待时间
  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值