环形队列(Python代码实现)

环形队列是是在普通队列上进行的变化,本质和普通单向队列相同,都是队尾进队,队首出队。环形队列与普通队列的区别在于它能够循环利用空间,元素从队首出队后释放的空间能够被重复利用。

主要特点:

  • 当队尾指针front = Maxsize + 1时,在前进一个位置就到0
  • 队首指针前进1:front = (front + 1) % Maxsize
  • 队尾指针前进1:rear = (rear + 1) % Maxsize
  • 队空条件:rear == front
  • 队满条件:(rear + 1) % Maxsize == front (注:此处不能用队首和队尾指针一致判断)

 实现代码:

class CircleQueue(object):
    """环形队列"""

    def __init__(self, size=10):
        self.queue = [0 for i in range(size)]
        self.size = size
        self.rear = 0       # 队尾指针
        self.front = 0      # 队首指针

    def enqueue(self, item):
        """进队"""
        if not self.is_full():
            self.rear = (self.rear + 1) % self.size  # 队尾指针前移
            self.queue[self.rear] = item
        else:
            print("队列已满!")

    def dequeue(self):
        """出队"""
        if not self.is_empty():
            self.front = (self.front + 1) % self.size  # 队首指针前移
            return self.queue[self.front]
        else:
            print("队列为空!")

    def is_empty(self):
        """判断环形队列是否为空"""
        return self.front == self.rear

    def is_full(self):
        """判断环形队列是否已满"""
        return (self.rear + 1) % self.size == self.front

    def travel(self):
        """遍历队列元素"""
        if not self.is_empty():
            for i in range(self.front, self.rear + 1):
                print(self.queue[i], end="")
            print()
        else:
            print("队列为空!")


if __name__ == '__main__':
    queue = CircleQueue()
    print(queue.is_empty())
    queue.enqueue(1)
    queue.enqueue(2)
    queue.enqueue(3)
    queue.enqueue(4)
    queue.dequeue()
    queue.travel()
    queue.enqueue(5)
    queue.travel()
    print(queue.is_empty())
    print(queue.is_full())


版权声明:本文为moodfriend原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。