环形队列是是在普通队列上进行的变化,本质和普通单向队列相同,都是队尾进队,队首出队。环形队列与普通队列的区别在于它能够循环利用空间,元素从队首出队后释放的空间能够被重复利用。
主要特点:
- 当队尾指针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())