一、栈
遵循先入后出(First In, Last Out)原则的线性数据结构。
只能在栈顶添加或删除元素
链表实现形式:
①栈以链表形式实现:
②以数组形式实现
二、队列
遵循先入先出(First In, First Out)规则的线性数据结构。
①以链表形式实现:
②以数组形式实现:
由于数组删除首元素的时间复杂度为O(n) ,这会导致出队操作效率较低。我们可以使用一个变量 front
指向队首元素的索引,并维护一个变量 queSize
用于记录队列长度。定义 rear = front + queSize
,这个公式计算出的 rear
指向队尾元素之后的下一个位置。
基于此设计,数组中包含元素的有效区间为 [front, rear - 1],进而:
- 对于入队操作,将输入元素赋值给
rear
索引处,并将queSize
增加 1 ; - 对于出队操作,只需将
front
增加 1 ,并将queSize
减少 1 ;
第二步rear应该指到4下面的格子了
实现“首尾相连”:rear: int = (self.__front + self.__size) % self.capacity() self.__nums[rear] = num
self.__size += 1
num: int = self.peek()
self.__front = (self.__front + 1) % self.capacity()
self.__size -= 1
def to_list(self) -> list[int]:
"""返回列表用于打印"""
res = [0] * self.size()
j: int = self.__front
for i in range(self.size()):
res[i] = self.__nums[(j % self.capacity())]
j += 1
return res
三、双向队列:
队列仅能在头部删除或在尾部添加元素。而双向队列deque允许在头部和尾部执行元素的添加或删除操作。
①用双向链表实现:
②用环形数组实现:
def index(self, i: int) -> int:
"""计算环形数组索引"""
# 通过取余操作实现数组首尾相连
# 当 i 越过数组尾部后,回到头部
# 当 i 越过数组头部后,回到尾部
return (i + self.capacity()) % self.capacity()