数据结构-队列
「队列 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())

 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号