一.题目:
设计一个环形队列数据结构.
Example:
MyCircularQueue circularQueue = new MyCircularQueue(3); // set the size to be 3
circularQueue.enQueue(1); // return true
circularQueue.enQueue(2); // return true
circularQueue.enQueue(3); // return true
circularQueue.enQueue(4); // return false, the queue is full
circularQueue.Rear(); // return 3
circularQueue.isFull(); // return true
circularQueue.deQueue(); // return true
circularQueue.enQueue(4); // return true
circularQueue.Rear(); // return 4
二.解题思路:
首先我们要确定设计几个变量,首先要有一个列表用来存储数据,其次还需要一个首指针,再加上一个实际有效的长度.由于是环形队列,我们可以利用对最大长度求余这个小trick来计算下标.
代码如下:
class MyCircularQueue(object):
def __init__(self, k):
"""
Initialize your data structure here. Set the size of the queue to be k.
:type k: int
"""
self._queue = [None] * k #the basic
self._capacity = k
self._len = 0
#The first three as one group and the last
self._front = 0
#self._rear is not necessary, because rear = front + length -1
def enQueue(self, value):
"""
Insert an element into the circular queue. Return true if the operation is successful.
:type value: int
:rtype: bool
"""
if self.isFull():
return False
avail = (self._front + self._len) % (self._capacity)
self._queue[avail] = value
self._len += 1
return True
def deQueue(self):
"""
Delete an element from the circular queue. Return true if the operation is successful.
:rtype: bool
"""
if self.isEmpty():
return False
self._queue[self._front] = None #overrode the current node
self._front = (self._front+1) % self._capacity
self._len -= 1
return True
def Front(self):
"""
Get the front item from the queue.
:rtype: int
"""
if not self.isEmpty():
return self._queue[self._front]
else:
return -1
def Rear(self):
"""
Get the last item from the queue.
:rtype: int
"""
if not self.isEmpty():
_rear = (self._front + self._len - 1) % self._capacity
return self._queue[_rear]
else:
return -1
def isEmpty(self):
"""
Checks whether the circular queue is empty or not.
:rtype: bool
"""
return self._len == 0
def isFull(self):
"""
Checks whether the circular queue is full or not.
:rtype: bool
"""
return self._len == self._capacity
# Your MyCircularQueue object will be instantiated and called as such:
# obj = MyCircularQueue(k)
# param_1 = obj.enQueue(value)
# param_2 = obj.deQueue()
# param_3 = obj.Front()
# param_4 = obj.Rear()
# param_5 = obj.isEmpty()
# param_6 = obj.isFull()