队列
队列类似于栈结构,不过遵循先进先出的原则,其实就跟排队一个道理,构造难度相对链表也要小很多,因为没有基础几点数据结构。链表的基础属性是头,尾,值。
单向队列
class Queue(object):
'''
队列遵循先进先出的原则
队列包含数据,头,尾,长度四个属性,长度为预设长度,因为数组list初始化时必须赋值,所以都赋值为0:
元素加入队列:元素数量不超过预设长度的情况下,尾部下标加一,相应位置赋值;
输出元素队列:队列存在元素的情况下从‘头’到‘尾’输出数据元素值;
输出队首元素:队列存在元素的情况下输出‘头’元素;
删除队首元素:队列存在元素的情况下头部位置向下推一位就行了。
'''
def __init__(self, length):
self.__data = [0 for x in range(1, length + 1)]
self.__head = 0
self.__tail = -1
self.__length = length
# 元素加入队列
def push(self, element):
if self.__tail + 1 < self.__length:
self.__tail += 1
self.__data[self.__tail] = element
# 输出队列元素
def output(self):
for x in range(self.__head, self.__tail + 1):
print(self.__data[x], "- ", end="")
print("")
# 输出队首元素
def front(self):
if self.__tail < self.__head:
return
return self.__data[self.__head]
# 删除队首元素
def pop(self):
if self.__tail < self.__head:
return
self.__head += 1
假设队列总长度为6
graph RL
F((0))-->E((0))
E((0))-->A((4))
A((4:tail))-->B((3))
B((3))-->C((2))
C((2))-->D((1:head))
元素加入队列
graph RL
F((0))-->E((5))
E((5:tail))-->A((4))
A((4))-->B((3))
B((3))-->C((2))
C((2))-->D((1:head))
删除队首元素
graph RL
F((0))-->E((5))
E((5:tail))-->A((4))
A((4))-->B((3))
B((3))-->C((2))
C((2:head))-->D((1))
循环队列
循环队列的改造无非就是利用了因为弹出队首元素而造成的队列空间浪费。所以是否可以压入新的元素的条件不再是队尾位置小于长度,而是元素数量是否超过队列可容纳元素长度,所以多加了一个count来计数。
class RoundQueue:
'''
为什么会有循环队列,就是避免单向队列头部的空间随着先进先出逐渐浪费掉,所以循环队列就是把事先声明的空间都尽量利用起来,
所以随着head推后,新加入的队列还是加入的,直到队列真正的满了。
'''
def __init__(self, length):
self.__data = [0 for x in range(1, length + 1)]
self.__head = 0
self.__tail = -1
self.__length = length
self.__count = 0
def push(self, element):
if self.__count < self.__length:
self.__tail = (self.__tail + 1) % self.__length #比长度多多少,就回到数组首址往下数多少
self.__data[self.__tail] = element
self.__count+=1
def output(self):
for x in range(self.__head, self.__tail + 1):
if x > self.__length - 1:
x = x % self.__length
print(self.__data[x], "- ", end="")
print("")
def front(self):
if self.__count < 0:
return
return self.__data[self.__head]
def pop(self):
if self.__count < 0:
return
self.__head = (self.__head + 1) % self.__length
self.__count -= 1
假设队列总长度为6,这是经过一些出队入队操作后的队列
graph RL
D((1))-->F((6))
F((6:tail))-->E((5))
E((5))-->A((4))
A((4:head))-->B((3))
B((3))-->C((2))
C((2))-->D((1))
元素加入队列
graph RL
D((1))-->F((6))
F((6))-->E((5))
E((5))-->A((4))
A((4:head))-->B((3))
B((3))-->C((2))
C((2))-->D((1:tail))
graph RL
D((1))-->F((6))
F((6))-->E((5))
E((5))-->A((4))
A((4:head))-->B((3))
B((3))-->C((2))
C((2:tail))-->D((1))