队列:先进先出

出队只能在队头进行

入队只能在队尾进行

循环队列

在顺序队列中,尾指针到达队列边界时,就不能再进行入队操作了

在循环队列中,尾指针到达队列边界时,下一步指向下标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)