数据结构-队列

「队列 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 @ 2023-06-14 20:56  天才九少  阅读(48)  评论(0)    收藏  举报