2017-10-06 152 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(),它会工作。