队列
队列 (queue) 是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列符合先进先出[FIFO]的原则。
复杂度分析
队列属于常见的一种线性结构,对于出队和进队而言,时间复杂度都为 O(1)。
用链表实现队列
class Node(object):
def __init__(self, elem):
self.elem = elem # 表示对应的元素值
self.next = None # 表示下一个链接的链点
class Queue(object):
def __init__(self):
self.head = None # 头部链点为 None
self.rear = None # 尾部链点为 None
def is_empty(self):
return self.head is None # 判断队列是否为空
def enqueue(self, elem):
p = Node(elem) # 初始化一个新的点
if self.is_empty():
self.head = p # 队列头部为新的链点
self.rear = p # 队列尾部为新的链点
else:
self.rear.next = p # 队列尾部的后继是这个新的点
self.rear = p # 然后让队列尾部指针指向这个新的点
def dequeue(self):
if self.is_empty(): # 判断队列是否为空
print('Queue_is_empty') # 若队列为空,则退出 dequeue 操作
else:
result = self.head.elem # result为队列头部元素
self.head = self.head.next # 改变队列头部指针位置
return result # 返回队列头部元素
def peek(self): # 查看队列头部的元素
if self.is_empty(): # 判断队列是否为空
print('NOT_FOUND') # 为空则返回 NOT_FOUND
else:
return self.head.elem # 返回队列头部元素
def print_queue(self):
print("queue:")
temp = self.head
myqueue = [] # 暂时存放队列数据
while temp is not None:
myqueue.append(temp.elem)
temp = temp.next
print(myqueue)
if __name__ == "__main__":
queue = Queue()
queue.enqueue(21)
queue.enqueue(35)
queue.enqueue(58)
queue.enqueue(13)
queue.dequeue()
queue.print_queue()
用数组实现队列
class Queue():
def __init__(self):
self.entries = [] # 表示队列内的参数
self.length = 0 # 表示队列的长度
self.front = 0 # 表示队列头部位置
def enqueue(self, item):
self.entries.append(item) # 添加元素到队列里面
self.length = self.length + 1 # 队列长度增加 1
def dequeue(self):
self.length = self.length - 1 # 队列的长度减少 1
dequeued = self.entries[self.front] # 队首元素为dequeued
self.front -= 1 # 队首的位置减少1
self.entries = self.entries[self.front:] # 队列的元素更新为退队之后的队列
return dequeued
def peek(self):
return self.entries[0] # 直接返回队列的队首元素