Python实现队列

队列的数据存储结构可以是顺序表,也可以是链表,本篇使用 Python 来分别实现顺序队列和链队列。

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 实现的顺序队列及链队列。

 

Python实现队列_Python链队列_02