赞
踩
本篇章主要介绍链队列,并用Python实现其基本操作。
队列的链式存储结构称为链队列,也是在单链表的基础上进行的修改,它是一个同时带有队首指针front和队尾指针rear的单链表,队首指针指向队首节点,队尾指针指向队尾结点。其结点定义同单链表结点:
class LinkNode(object):
def __init__(self, data=None, next=None):
self.data = data
self.next = next
队空条件: f r o n t = = r e a r front==rear front==rear。
出队时,先取出队首元素,将其从链表中移除,并让front指向其下一个结点,若该结点为最后一个结点,则置front和rear都为None。
入队时,先建立一个新结点,将新结点插入到链表的尾部,并让rear指向这个新插入的结点,若原队列为空时,则让front也指向这个新插入的结点。
操作名称 | 操作说明 |
---|---|
CreateLinkQueue(val_list) | 创建链队列 |
IsEmpty() | 判断链队列是否为空 |
LengthQueue() | 返回链队列的长度 |
Traverse() | 打印出链队列里的数据元素 |
EnQueue(data) | 入队 |
DeQueue() | 出队 |
GetHead() | 取队首元素 |
class LinkQueue(object): def __init__(self): # 用这种方法创建的front和rear是不一样的, 地址不一样 # self.front = LinkNode(None) # self.rear = LinkNode(None) # 用下面这种方法 temp_node = LinkNode(None) self.front = temp_node self.rear = temp_node def CreateLinkQueue(self, val_list): for val in val_list: self.EnQueue(val) def IsEmpty(self): if self.front == self.rear: return True else: return False def LengthQueue(self): prehead = self.front count = 0 while prehead.next: count += 1 prehead = prehead.next return count def EnQueue(self, e): new_node = LinkNode(e) if self.IsEmpty(): self.front.next = new_node self.rear.next = new_node self.rear = self.rear.next def DeQueue(self): if self.IsEmpty(): print('队为空!') exit() else: temp = self.front.next self.front.next = temp.next if self.rear == temp: # 这个结点是尾结点 self.front = self.rear return temp.data def Traverse(self): prehead = self.front while prehead.next: prehead = prehead.next print(prehead.data, end=' ') print('') def GetHead(self): return self.front.next.data
测试代码如下:
if __name__ == '__main__':
q1 = LinkQueue()
q1.CreateLinkQueue([1, 3, 5, 7, 9])
print('队列里的元素为: ', end='')
q1.Traverse()
print('队列的长度为: %d' % q1.LengthQueue())
print('队首元素为: %d' % q1.GetHead())
print('出队: ', end='')
for i in range(q1.LengthQueue()):
print(q1.DeQueue(), end=' ')
运行结果如下:
链式队列比较适合于数据元素变动较大的情形,如果程序中要使用多个队列,最好也使用链式队列。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。