Circular Queue
题目描述
Implement a circular queue using simple array.
解题方法
维护两个变量,记录queue的开头和结尾,分别用作dequeue和enqueue
headtail
如何判断queue是否为空呢,仅用head和tail判断是不行的,因为这样空queue和
full queue的状态是一样的,所以再加一个变量num_elements
当queue满了的时候,我们需要resize the array, 一般是double the size,而这时候 circular queue里的elements就应该reorder, head和tail的位置也应该reset。
reorder的规则就是将head reset到0的位置,相当于重新从头排列,这里我们可以根据 现在head的位置对array的elements进行shift。
python rotate
python的deque有rotate的method, 而如果一定要用array,我们可以自己implement一个 rotate()
Solution
def rotate(l, n):
return l[-n:] + l[:-n]
class Queue(object):
def __init__(self, size):
self.queue = [None] * size
self.size = size
self.head = 0
self.tail = 0
self.num_elements = 0
def enqueue(self, val):
if self.num_elements == self.size: # full, need resize
# 先rotate & reset
rotate(self.queue, -head) # rotate to the left
self.head = 0
self.tail = self.num_elements
self.queue += [None] * self.size
self.size *= 2
self.queue[self.tail] = val
self.tail = (self.tail + 1) % self..size
self.num_elements += 1
def dequeue(self):
if self.num_elements != 0:
result = self.queue[head]
self.head = (self.head + 1) % self.size
self.num_elements -= 1
return result
else:
raise