计划在2021年课改时,要把双端队列加入到人工智能专业教学中!!!
双端队列:
双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构;
双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行;
双端队列可以在队列任意一端入队和出队;
双端队列示意图:
双端队列代码构造(链表实现)
class Node(object):
"""结点类"""
def __init__(self, item):
"""实例属性初始化和赋值"""
self.item = item
self.next = None
class Queue(object):
def __init__(self, head=None, end=None):
# 初始化头结点游标指针
self.head = head
# 初始化尾结点游标指针
self.end = end
def add(self, item):
"""头部添加"""
# 实例化一个新结点
node = Node(item)
# 头结点存在情况
if self.head:
cur = self.head
node.next = cur
self.head = node
# 头结点不存在的情况
else:
self.head = node
self.end = node
def append(self, item):
"""尾部添加"""
# 实例化一个新结点
node = Node(item)
# 尾结点存在情况
if self.end:
# 直接调整尾结点next指针指向新节点
cur = self.end
cur.next = node
self.end = node
# 尾结点不存的情况
else:
self.head = node
self.end = node
def head_remove(self):
"""头部删除"""
# 头结点存在的情况
if self.head:
# 保存头结点
cur = self.head
# 判断是不是孤立结点
# 如果不是孤立结点,正常删除
if cur.next is not None:
node = cur.next
self.head = node
# 如果是孤立结点,则头结点指向None,就代表删除成功
else:
self.head = None
return
def end_remove(self):
"""尾部删除"""
# 判断尾结点是否存在
# 存在的情况
if self.end:
# 创建两个临时游标节后头结点和None对象
cur = self.head
pro = None
# 构造查找尾结点的循环条件
while cur.next is not None:
# 循环内部,两个游标正常移动并赋值
pro = cur
cur = cur.next
# 循环终止,说明cur已经定位到尾节点,如果要删除尾结点
# 只需要让前面的pro节点指向为None即可
pro.next = None
return
def treavl(self):
# 空链表情况
if self.head is None:
return
# 不为空链表的情况
cur = self.head
# 构造从头结点循环到尾结点的条件
while cur is not None:
# 打印节点元素
print(cur.item)
# 移动游标
cur = cur.next
return
if __name__ == '__main__':
q = Queue()
q.add(1)
q.add(2)
q.append(3)
q.append(4)
q.append(5)
q.treavl()
print("---------------------")
q.head_remove()
q.end_remove()
q.treavl()