文章目录
- 前言
- 1. 链队列
- 2. 基本操作
- 3. 代码实现
- 结束语
前言
本篇章主要介绍链队列,并用Python实现其基本操作。
1. 链队列
队列的链式存储结构称为链队列,也是在单链表的基础上进行的修改,它是一个同时带有队首指针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也指向这个新插入的结点。
2. 基本操作
操作名称 | 操作说明 |
---|---|
CreateLinkQueue(val_list) | 创建链队列 |
IsEmpty() | 判断链队列是否为空 |
LengthQueue() | 返回链队列的长度 |
Traverse() | 打印出链队列里的数据元素 |
EnQueue(data) | 入队 |
DeQueue() | 出队 |
GetHead() | 取队首元素 |
3. 代码实现
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=' ')
运行结果如下:
结束语
链式队列比较适合于数据元素变动较大的情形,如果程序中要使用多个队列,最好也使用链式队列。