数据结构-队列

「队列 Queue」是一种遵循「先入先出 first in, first out」数据操作规则的线性数据结构

 队列的实现方式:环形队列(队列不能用列表简单实现,因此采用环形队列)

  • 基于数组
  • 基于链表

环形队列:

size:队列的长度

front:队首指针

rear:队尾指针

队首指针前进1:front = (front + 1) % size  之所以要 模 长度 是因为要判断是否到达队尾

队尾指针前进1:rear = (rear + 1) % size

队空条件:rear = front  两个指针重合就是队空

队满条件:(rear + 1)% size = front  队首为空,队尾在队首后面一个位置就是队满

基于数组

复制代码
# 基于数组的环形队列
class Queue:

    def __init__(self, size=100):
        self.queue = [0 for _ in range(size)]
        self.size = size
        self.rear = 0   # 队尾指针
        self.front = 0  # 队首指针

    def push(self, element):  # 入队列
        if not self.is_filled():
            self.rear = (self.rear + 1) % self.size  # 队尾指针前进1
            self.queue[self.rear] = element  
        else:
            raise IndexError("Queue is filled.")

    def pop(self):  # 出队列
        if not self.is_empty():
            self.front = (self.front + 1) % self.size  
            return self.queue[self.front]
        else:
            raise IndexError("Queue is empty.")

    def is_empty(self):  # 判断队空
        return self.rear == self.front

    def is_filled(self):  # 判断队满
        return (self.rear + 1) % self.size == self.front


q = Queue(5)
for i in range(4):
    q.push(i)
print(q.pop())
q.push(5)
print(q.is_filled())
复制代码

 基于链表

复制代码
class ListNode:
    def __init__(self, val: int):
        self.val = val                  # 结点值
        self.next = None     # 指向下一结点的指针

class LinkedListQueue:
    """ 基于链表实现的队列 """
    def __init__(self):
        self.__front = None  # 头结点 front
        self.__rear = None   # 尾结点 rear
        self.__size = 0  # 队列长度

    def size(self):
        """ 获取队列的长度 """
        return self.__size

    def is_empty(self):
        """ 判断队列是否为空 """
        return not self.__front

    def push(self, num):
        """ 入队 """
        node = ListNode(num)  
        # 如果队列为空,则令头、尾结点都指向该结点
        if self.__front is None:
            self.__front = node
            self.__rear = node
        # 如果队列不为空,则将该结点添加到尾结点后
        else:
            self.__rear.next = node
            self.__rear = node
        self.__size += 1

    def peek(self):
        """ 访问队首元素 """
        if self.size() == 0:
            return False
        return self.__front.val

    def pop(self):
        """ 出队 """
        num = self.peek()
        # 删除头结点
        self.__front = self.__front.next
        self.__size -= 1
        return num

    def to_list(self):
        """ 转化为列表用于打印 """
        queue = []
        temp = self.__front
        while temp:
            queue.append(temp.val)
            temp = temp.next
        return queue

A = LinkedListQueue()
A.push(1)
A.push(2)
A.push(3)
A.pop()
print(A.peek())
复制代码
posted @   天才九少  阅读(32)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示