2015-06-04 226 views
2

我一直試圖讓我的循環隊列工作一段時間,只是想我會問一個問題,看看我能否得到任何提示。我的循環隊列的問題是,即使隊列未滿,插入方法始終返回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,因爲我知道一個事實,即隊列不滿,因爲這是我曾試圖進入的第一個值。任何提示?

+1

如果你不必自己實現這個,你可以使用標準庫deque。 – csharpcoder

+0

沒有辦法'insert'返回'None'。 –

+0

對不起,我的意思是插入返回False ...我的錯對不起。 – stacker

回答

1

您將_front_rear初始化爲0,因此您的is_full檢查從一開始就返回True。

+0

我覺得這是問題,現在想辦法改變我的is_full方法。 – stacker

+0

用大小爲3的隊列繪出一個快速示例。插入3個元素。刪除1.插入1.應該很容易從那裏找出「is_full」條件。 – Synergist

+0

鑲刀1,2,3: Q = [1,2,3] remove1: Q = [無,2,3] insert1: Q = [2,3,1] 所以我猜,如果self._front = 0和self._rear = self._size: q是全 其他: q是不是滿了? – stacker