一、栈
一个数据集合,只能在一端进行插入或删除操作的列表。
特点:后进先出
功能实现:
进栈:li.append()
出栈:li.pop()
取栈顶:li[-1]
栈的图解:
class Stack: # 构造一个类
def __init__(self): # 创建栈
self.stack = []
def push(self, element): # 进栈
self.stack.append(element)
def pop(self): # 出栈
return self.stack.pop()
def get_top(self): # 取栈顶
if len(self.stack) > 0:
return self.stack[-1]
else:
return None
def is_empty(self): # 判断栈是否为空
return len(self.stack) == 0
二、队列
一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。进行插入的一端叫队尾(rear),插入动作成为进队或入队,进行删除的一端叫做队首(front),删除动作叫做出队。
性质:先进先出
1、队列的实现方式---环形队列
刚开始,rear 和 front 同时指向 0 位置,每进队一个数,rear 往后移动一个位置。出队一个数,front 往后移动一个位置。为了不与队空条件判定发生矛盾,特意空出一个位置,令rear + 1 = front 时为队满。
环形队列:当队尾指针front == Maxsize - 1 时,再前进一个位置自动到0.
队首指针前进1:front = (front + 1) % Maxsize
队尾指针前进1:rear = (rear + 1) % Maxsize
队空条件:rear == front
队满条件:(rear + 1) % Maxsize == front
2、代码实现
class Queue:
def __init__(self, size=100):
self.queue = [0 for i 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
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
def __str__(self):
return 'Queue: ' + str(self.queue)
q = Queue(5)
for i in range(4):
q.push(i)
print(q)
3、队列python内置模块
# 队列的内置模块(双向队列)
# 双向队列 队首队尾都可以进行出队和入队操作
from collections import deque
# 创建一个队列
q = deque([参数1, 参数2) # 参数1表示要进队的列表,参数2表示队列的最大长度,到最大长度以后前面的元素自动出队,如果不写参数默认创建空队列。
# 单向队列
q.append(参数) # 队尾进队 参数表示要进队的数
q.popleft() # 队首出队
#
# 用于双向队列
q.appendleft(参数) # 队首进队 参数表示要进队的数
q.pop() # 队尾出队