2017-10-06 116 views
0

所以我的老師讓我們實現一個使用我的數據結構類的堆棧鏈表的隊列。我想出了下面的代碼,我似乎不明白,蟒蛇給我,當我跑我的單元測試的錯誤...Python的隊列鏈接列表

這裏是我的代碼`

class QueueLinked: 

    def __init__(self,capacity): 
     self.capacity = capacity # a capacity 
     self.num_items = 0 
     self.front = None 
     self.rear = None 

    def is_empty(self):  # This function will retrun a bool if the number of items is = to 0 
     return self.num_items == 0 

    def is_full(self): 
     return self.num_items == self.capacity 

    def enqueue(self, item): 
     if self.num_items == self.capacity: 
      raise IndexError('Can\'t enqueue into full queue.') 
     else: 
      self.num_items +=1 
      temp = Node() # this creates a temporary node 
      oldrear = self.rear 
      self.rear = temp 
      oldrear.set_next(self.rear) 


    def dequeue(self): 
     if self.num_items == 0: # this will through an exception because if there are no items we cant pop 
      raise IndexError('Can\'t dequeue from empty queue.') 
     else: 
      self.num_items -=1 
      oldfront = self.front 
      self.front = self.front.get_next() 
      return oldfront.get_data() 


    def num_in_queue(self): 
     return self.num_items 


class Node: 

    def __init__(self): 
     self.next = None # this initializes a node with next pointing to none 

    def set_data(self, data): # this passes the parameter data to the data portion of the node 
     self.data = data # this constructs that data portion of a node everytime we create a node 

    def get_data(self): # get data from the node that was previous newwest 
     return self.data # returns the data from that node 

    def set_next(self, newNext): # this will set a new next to point as in after the head 
     self.next = newNext # this constructs the next portion of the 2 part portion from the node 

    def get_next(self): # this will retrieve the next value from the node 
     return self.next` 

這裏是我的單位測試用例

import unittest 

from queues import * 


class TestCase(unittest.TestCase): 


    # testing an empty Array 

    def test_if_empty(self): # we will test if the array is empty using is_empty 
     q = QueueLinked(3) # [none,none,none] 
     self.assertTrue(q.is_empty()) # Should be True 

    def test_if_full(self): 
     q = QueueLinked(3) 
     q.enqueue(4) 
     q.enqueue(5) 
     q.enqueue(8) 
     self.assertTrue(q.is_empty()) 

if (__name__ == '__main__'): 

,這是我一直在接受我的Pycharm錯誤..

Ran 2 tests in 0.000s 

FAILED (errors=1) 
Launching unittests with arguments python -m unittest test_queues.TestCase in C:\Users\M\Documents\CSC 202\Labs\Lab3 
Error 
Traceback (most recent call last): 
    File "C:\Users\M\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 59, in testPartExecutor 
    yield 
    File "C:\Users\M\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 605, in run 
    testMethod() 
    File "C:\Users\M\Documents\CSC 202\Labs\Lab3\test_queues.py", line 17, in test_if_full 
    q.enqueue(4) 
    File "C:\Users\M\Documents\CSC 202\Labs\Lab3\queues.py", line 63, in enqueue 
    oldrear.set_data(self.rear) 
AttributeError: 'NoneType' object has no attribute 'set_data' 

我不明白什麼?

+0

第一次通過'self.rear == None',所以當你設置'oldrear'時你試圖調用'None.set_data' – jmunsch

+1

你是否包含正確的代碼?我在'Queue()。enqueue()'中看不到'oldrear.set_data()' –

回答

0

正如有人在評論中已經指出的那樣,你發佈的回溯表示set_data是在enqueue方法中調用的,而你的代碼只會調用set_next。不過,我假設你遇到類似的錯誤set_next

QueueLinked中初始化的值爲self.rear,值爲None。在enqueue方法中,初始化變量oldrear的值爲self.rear,該值在調用enqueue時仍爲None。此時oldrearself.rear均爲None。你試圖撥打電話set_nextoldrear(仍然== None),並得到一個錯誤,告訴你None didens't有set_next方法。

我還沒有在整個代碼,所以我不知道這是否是正確的,但我相信你可以只初始化self.rear = Node(),它會工作。