我一直試圖讓我的循環隊列工作一段時間,只是想我會問一個問題,看看我能否得到任何提示。我的循環隊列的問題是,即使隊列未滿,插入方法始終返回False值。這是我到目前爲止。循環隊列Python實現
class CircularQueue:
def __init__(self, size):
"""
-------------------------------------------------------
Initializes an empty queue. Data is stored in a list.
-------------------------------------------------------
Postconditions:
Initializes an empty queue.
-------------------------------------------------------
"""
assert size>=0, "size must be >=0"
self._values = [None] * size
self._front = 0
self._rear = 0
self._size = size
self.size = 0
return
def __len__(self):
"""
-------------------------------------------------------
Returns the size of the queue.
Use: n = len(q)
-------------------------------------------------------
Postconditions:
Returns the number of values in the queue.
-------------------------------------------------------
"""
return len(self._values())
def is_full(self):
value = self._rear - self._size
if self._values[value]==None:
full = False
else:
full = True
return full
def is_empty(self):
"""
-------------------------------------------------------
Determines if the queue is empty.
Use: b = q.is_empty()
-------------------------------------------------------
Postconditions:
Returns True if the queue is empty, False otherwise.
-------------------------------------------------------
"""
if len(self._values) == 0:
empty = True
else:
empty = False
return empty
def insert(self, value):
"""
-------------------------------------------------------
Inserts a copy of value into the queue.
Use: q.insert(value)
-------------------------------------------------------
Preconditions:
value - a data element (?)
Postconditions:
value is added to the rear of the queue.
-------------------------------------------------------
"""
if self.is_full() == True:
inserted = False
else:
inserted = True
self._values[self._rear] = value
self._rear = (self._rear + 1)% self._size
return inserted
def remove(self):
"""
-------------------------------------------------------
Removes and returns value from the queue.
Use: v = q.remove()
-------------------------------------------------------
Postconditions:
Returns the value at the front of queue - the value is
removed from queue. Returns None if queue is empty.
-------------------------------------------------------
"""
if self.is_empty() == False:
value = copy.deepcopy(self._values[self._front])
self._front = (self._front + 1) % self._size
else:
value = None
return value
def peek(self):
"""
-------------------------------------------------------
Peeks at the front of queue.
Use: v = q.peek()
-------------------------------------------------------
Postconditions:
Returns a copy of the value at the front of queue -
the value is not removed from queue. Returns None
if queue is empty.
-------------------------------------------------------
"""
if self.is_empty() == True:
value = None
else:
value = copy.deepcopy(self._values[self._front])
return value
def print_i(self):
"""
-------------------------------------------------------
Prints the contents of queue from front to rear.
Use: q.print_i()
-------------------------------------------------------
Postconditions:
Prints each value in queue from front to rear.
Each value starts on a new line.
-------------------------------------------------------
"""
for i in range(len(self._values)):
print(self._values[i])
return
我剛開始嘗試測試它,所以這是我所有的測試模塊。
from circularqueue import CircularQueue
q = CircularQueue(10)
value = q.insert(1)
print(value)
所有我想在這裏做的是看看我的插入方法將返回true,因爲我知道一個事實,即隊列不滿,因爲這是我曾試圖進入的第一個值。任何提示?
如果你不必自己實現這個,你可以使用標準庫deque。 – csharpcoder
沒有辦法'insert'返回'None'。 –
對不起,我的意思是插入返回False ...我的錯對不起。 – stacker