簡體   English   中英

Python的隊列鏈接列表

[英]Queue Linked List for Python

所以我的老師讓我們為我的數據結構課程使用堆棧鏈接列表實現隊列。 我想出了以下代碼,但我似乎不理解當我運行單元測試時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'

我不明白什么?

正如評論中有人指出的那樣,您發布的回溯信息說set_data是在enqueue方法中調用的,而僅調用set_next代碼未反映出這set_next 但是我假設您使用set_next遇到類似的錯誤。

QueueLinked ,使用值None初始化self.rear enqueue方法中,使用oldrear的值初始化變量oldrearself.rear調用enqueue它的值仍然為None 在這一點上, oldrearself.rear都為None 然后,您嘗試在oldrear (仍為== None )上調用set_next ,並得到一條錯誤消息,告訴您None set_next方法。

我還沒有遍歷整個代碼,所以不確定這是否正確,但是我認為您可以初始化self.rear = Node()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM