队列:先进先出
出队只能在队头进行
入队只能在队尾进行
循环队列
在顺序队列中,尾指针到达队列边界时,就不能再进行入队操作了
在循环队列中,尾指针到达队列边界时,下一步指向下标0,如果有空位还可以继续入队
判断队空队满
队空队满的条件都是start = end,如何区分?
这时我们设置一个标志位flag,执行出队操作时设为0,入队操作时设为1
start = end的情况下(只有队空和队满两种情况):
判断队列非空时:如果flag为1,那么上一次操作一定是入队,所以队列一定非空,即队满
剩下的另一种情况,即flag为0,就是队列为空了
代码
class CircleQueue:
def __init__(self,size):
# 初始化队列
self.queue = [None] * size
self.size = size
self.start = 0
self.end = 0
self.flag = False
def isFull(self):
#判队满
return self.start == self.end and self.flag
def isEmpty(self):
#判队空
return self.start == self.end and not self.flag
def EnQueue(self,elem):
#入队
if self.isFull():
print("The queue is full!")
else:
self.queue[self.end] = elem
if self.end == self.size - 1:
self.end = 0
else:
self.end += 1
self.flag = 1
def DeQueue(self):
#出队
if self.isEmpty():
print("The queue is empty!")
else:
self.queue[self.start] = None
if self.start == self.size - 1:
self.start = 0
else:
self.start += 1
self.flag = 0
if __name__ == "__main__":
# 建立大小为9的循环队列
q = CircleQueue(9)
# 0 - 6入队列
for i in range(0,7):
q.EnQueue(i)
print(q.queue)
#出队2个元素
for i in range(2):
q.DeQueue()
print(q.queue)
# 0 - 6入队列
for i in range(0,7):
q.EnQueue(i)
print(q.queue)
#出队所有元素
for i in range(13):
q.DeQueue()
print(q.queue)