环形队列是是在普通队列上进行的变化,本质和普通单向队列相同,都是队尾进队,队首出队。环形队列与普通队列的区别在于它能够循环利用空间,元素从队首出队后释放的空间能够被重复利用。
主要特点:
- 当队尾指针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 = sizeself.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] = itemelse: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.reardef is_full(self):"""判断环形队列是否已满"""return (self.rear + 1) % self.size == self.frontdef 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())