一般队列
队列:是一个有序表,可以使用数组或者链表来实现
遵循的是先入先出的原则
队列是需要两个指针的,一个使用与添加数据,一个是用于输出数据的,当两个指针相同时表示该队列是空队列
import numpy as np
class ArrayQueue():
def __init__(self,maxsize = 10):
super(ArrayQueue, self).__init__()
self.list =[]
self.maxSize = maxsize
self.front = -1 # 指向 队列头部
self.rear = -1 # 指向队列尾部
# 判断队列中是否已满
def isfull(self):
return self.rear == self.maxSize -1
# 判断队列中是否已空
def isEmpty(self):
return self.rear == self.front
# 增加队列的数据
def addQueue(self,x):
if self.isfull():
print("队列已经满了,不能加入数据了")
return
self.rear = self.rear + 1
self.list.append(x)
# 取出队列中的数据
def getQueue(self):
if self.isEmpty():
print("队列已经空了,不能取数据")
return
self.front = self.front + 1
data = self.list.pop()
print("队列取出来的数据为:",data)
return data
# 显示队列中数据
def showlist(self):
if self.isEmpty():
print("队列已经空了,不能取数据")
return
print(self.list)
def headQueue(self):
if self.isEmpty():
print("队列已经空了,不能取数据")
return
return self.list[self.front]
if __name__ == '__main__':
arrayqueue = ArrayQueue()
while True:
key = input("请输入相应的值选项:")
if key == "s":
arrayqueue.showlist()
elif key == "g":
arrayqueue.getQueue()
else:
arrayqueue.addQueue(int(key))
循环队列
环形队列就是可以直接不断的填充到队列中,然后也可以不断地取(当然这两种操作都是需要在队列的最大容量中)
数组模拟环形队列的思路分析:
- Front指针的变量进行调整:指向队列的第一个元素.front的初始值为0
- Rear指针也做一下调整:指向队列的最后一个元素的后一个位置,因为希望空出一个空间做约定,rear的初始值也为0
- 当队列满时rear = maxsize – 1(原先的)现在的是(rear + 1)%maxsize = front
- 当队列为空的时候,rear == front
- 当我们这样进行分析的时候,队列中的有效数据的个数为 (rear + maxsize -front)%maxsize
- 就可以在原来的代码中进行修改
import numpy as np
class ArrayQueue():
def __init__(self ,maxsize = 4):
super(ArrayQueue, self).__init__()
self.list =[]
self.maxSize = maxsize
self.front = 0 # 指向 队列头部 原来等于-1的时候表示等于第一个数据的前一个
self.rear = 0 # 指向队列尾部的值的后一个位置
# 判断队列中是否已满
def isfull(self):
#return self.rear == self.maxSize - 1
p = (self.rear + 1) % self.maxSize == self.front
return p
# 判断队列中是否已空
def isEmpty(self):
return self.rear == self.front
# 增加队列的数据
def addQueue(self, x):
if self.isfull():
print("队列已经满了,不能加入数据了")
return
self.list.append(x)
self.rear = (self.rear + 1) % self.maxSize # 因为有可能直接到前面的位置
# 取出队列中的数据
def getQueue(self):
if self.isEmpty():
print("队列已经空了,不能取数据")
return
# 先把front对应的值保存到一个临时变量
# front后移
# 将临时变量返回
data = self.list.pop()
self.front = (self.front + 1) % self.maxSize
print("队列取出来的数据为:", data)
return data
# 显示队列中数据
def showlist(self):
if self.isEmpty():
print("队列已经空了,不能取数据")
return
for i in range(self.front,self.numqueue()):
print("列表的中的数据为{}".format(i % self.maxSize),self.list[i % self.maxSize])
# 返回当前循环队列中的有效数据的个数
def numqueue(self):
return (self.rear + self.maxSize - self.front) % self.maxSize
def headQueue(self):
if self.isEmpty():
print("队列已经空了,不能取数据")
return
print("头部数据为:",self.list[self.front])
if __name__ == '__main__':
arrayqueue = ArrayQueue()
while True:
key = input("请输入相应的值选项:")
if key == "s":
arrayqueue.showlist()
elif key == "g":
arrayqueue.getQueue()
elif key == "h":
arrayqueue.headQueue()
elif key == "q":
break
else:
arrayqueue.addQueue(int(key))