Python实现队列
队列的数据存储结构可以是顺序表,也可以是链表,本篇使用 Python 来分别实现顺序队列和链队列。
一、实现顺序队列
顺序队列是使用顺序表存储数据的队列,Python 中的列表元组都属于顺序表,下面使用列表来存储数据,实现顺序队列。
# coding=utf-8
class SequenceQueue(object):
def __init__(self):
self.__members = list()
def is_empty(self):
return not len(self.__members)
def show(self):
if self.is_empty():
print('队列为空')
return
for member in self.__members:
print('|' + member, end='')
print()
def enter(self, data):
self.__members.insert(0, data)
def outer(self):
if self.is_empty():
return
return self.__members.pop()
def length(self):
return len(self.__members)
def check(self, index):
if index < 0 or index > len(self.__members)-1:
raise IndexError
return self.__members[index]
定义一个 SequenceQueue() 类,实例化的时候会创建一个空列表,生成一个空的顺序队列。 Python 中的列表有很多自带的方法,所以将存储数据的列表设置成私有属性,避免用户在类外面链式调用列表的其他方法。如果用户直接在类外面操作列表,则队列“先进先出”的规则可能会被破坏。
下面是顺序队列的各个方法实现:
is_empty(): 判断顺序队列是否为空。如果存储数据的列表长度为零(对应布尔值False),则顺序队列为空(is_empty为True),反之。
show(): 展示顺序队列中的数据,也就是将队列中所有的数据依次打印输出。对存储数据的列表遍历输出即可,为了展示得更形象一点,我在队尾(入队的一端)打印竖线,表示不能从这一端取数据。
enter(data): 入队,也就是将数据添加到队列中。如果将列表的开头当成队尾,则入队可以调用列表的 insert(0, data) 方法。如果将列表的结尾当做队尾,则入队可以调用列表的 append(data) 方法。
outer(): 出队,也就是将数据从队列中取出,并将取出的数据返回。如果将列表的结尾当成队头,则出队可以直接调用列表的 pop() 方法,弹出并返回列表的最后一个数据。如果将列表的开头当做队头,则调用列表的 pop(0) 方法实现出队。
length(): 返回顺序队列的长度。顺序队列的长度就是存储数据的列表长度。
check(index): 返回顺序队列中指定位置的数据。根据指定的 index 值,将存储数据的列表中对应索引的数据返回即可。
if __name__ == '__main__':
sq = SequenceQueue()
print("is_empty: ", sq.is_empty())
sq.show()
sq.enter('u')
sq.enter('v')
sq.enter('x')
sq.enter('y')
sq.enter('z')
sq.show()
print(sq.outer())
sq.show()
print("sequence queue length: ", sq.length())
print("index member is: ", sq.check(2))
运行结果:
is_empty: True
队列为空
|z|y|x|v|u
u
|z|y|x|v
sequence queue length: 4
index member is: x
二、实现链队列
链队列是使用链表存储数据的队列,链表是逻辑有序的,由一个一个的节点构成,所以先声明一个创建节点的类。
class Node(object):
def __init__(self, data):
self.data = data
self.next = None
下面按照单向链表的方式来实现链队列。
class LinkQueue(object):
def __init__(self):
self.__head = None
def is_empty(self):
return not self.__head
def show(self):
if self.is_empty():
print('队列为空')
return
cur = self.__head
while cur is not None:
if cur.next is not None:
print('|' + cur.data, end='')
else:
print('|' + cur.data)
cur = cur.next
def enter(self, data):
node = Node(data)
node.next = self.__head
self.__head = node
def outer(self):
if self.is_empty():
return
cur = self.__head
prev = None
while cur.next is not None:
prev = cur
cur = cur.next
if cur == self.__head:
self.__head = self.__head.next
return
prev.next = cur.next
return cur.data
def length(self):
length = 0
cur = self.__head
while cur is not None:
length += 1
cur = cur.next
return length
def check(self, index):
if index < 0 or index >= self.length():
raise IndexError
cur = self.__head
for _ in range(index):
cur = cur.next
return cur.data
定义一个 LinkQueue() 类,实例化的时候会创建一个空链表,生成一个空的链队列。
下面是链队列的各个方法实现:
is_empty(): 判断链队列是否为空。如果存储数据的链表头指向空(对应布尔值False),则链队列为空(is_empty为True),反之。
show(): 展示链队列中的数据,也就是将队列中所有的数据依次打印输出。对存储数据的链表遍历输出即可,为了展示得更形象一点,我在队尾(入队的一端)打印竖线,表示不能从这一端取数据。
enter(data): 入队,也就是将数据添加到队列中。如果将链表的开头当成队尾,则入队就是在链表头添加节点。如果将链表的结尾当成队尾,则入队就是在链表尾添加节点。
outer(): 出队,也就是将数据从队列中取出,并将取出的数据返回。如果将链表的结尾当成队头,则出队就是删除并返回链表尾节点的数据。如果将链表的开头当做队头,则出队就是删除并返回链表头节点的数据。
length(): 返回链队列的长度。链队列的长度就是存储数据的链表长度。
check(index): 返回链队列中指定位置的数据。根据指定的 index 值,找到并返回链表中对应位置的节点数据。
lq = LinkQueue()
print("is_empty: ", lq.is_empty())
lq.show()
lq.enter('U')
lq.enter('V')
lq.enter('X')
lq.enter('Y')
lq.enter('Z')
lq.show()
print(lq.outer())
lq.show()
print("link queue length: ", lq.length())
print("index member is: ", lq.check(2))
运行结果:
is_empty: True
队列为空
|Z|Y|X|V|U
U
|Z|Y|X|V
link queue length: 4
index member is: X
以上就是用 Python 实现的顺序队列及链队列。