打印链接列表队列中的元素

时间:2018-02-12 06:40:09

标签: python python-3.x linked-list queue

我在python中有以下代码。我的问题是你如何打印链接队列中的每个元素?我知道我必须制作__repr____str__函数,但我不确定如何实现它。感谢。

class LinkedQueue :
    class _Node :
        def __init__(self, element, next):
            self._element = element
            self._next = next


        def get_elements():
            return self._element

        def set_elements(num):
            self._element = num    

    def __init__(self) :
        self._head = None
        self._tail = None
        self._size = 0

    def __len__(self) :
        return self._size

    def is_empty(self) :
        return self._size == 0

    def first(self) :
        if self.is_empty() :
            raise Empty('Queue is empty')
        return self._head._element

    def dequeue(self) :
        if self.is_empty():
            raise Empty('Queue is empty')
        answer = self._head._element
        self._head = self._head._next
        self._size -= 1
        if self.is_empty() :
            self._tail = None
        return answer

    def enqueue(self, e) :
        newest = self._Node(e,None)
        if self.is_empty() :
            self._head = newest
        else :
            self._tail._next = newest
        self._tail = newest
        self._size += 1

class Empty(Exception) :
    pass    

1 个答案:

答案 0 :(得分:2)

这取决于你想让repr看起来像什么,但这是一种方式。我们给_Node类一个简单的__repr__,它只返回元素的repr,并为LinkedQueue实例构建repr,我们遍历链表,存储每个{的repr。 {1}}到列表中。然后,我们可以在该列表上调用Node来为.join

制作代表
LinkedQueue

<强>输出

class Empty(Exception): 
    pass

class LinkedQueue: 
    class _Node:
        def __init__(self, element, _next=None):
            self._element = element
            self._next = _next

        def __repr__(self):
            return repr(self._element)

    def __init__(self): 
        self._head = None
        self._tail = None
        self._size = 0

    def __len__(self): 
        return self._size

    def __repr__(self):
        lst = []
        head = self._head
        while head is not None:
            lst.append(repr(head))
            head = head._next
        return 'Queue({})'.format(", ".join(lst))

    def is_empty(self): 
        return self._size == 0

    def first(self): 
        if self.is_empty(): 
            raise Empty('Queue is empty')
        return self._head._element

    def dequeue(self): 
        if self.is_empty():
            raise Empty('Queue is empty')
        answer = self._head._element
        self._head = self._head._next
        self._size -= 1
        if self.is_empty(): 
            self._tail = None
        return answer

    def enqueue(self, e): 
        newest = self._Node(e)
        if self.is_empty(): 
            self._head = newest
        else: 
            self._tail._next = newest
        self._tail = newest
        self._size += 1

# test

q = LinkedQueue()
for u in 'abcd':
    q.enqueue(u)
    print(len(q))

print(q)

while not q.is_empty():
    print(q.first(), q.dequeue())

我摆脱了吸气剂和放大器1 2 3 4 Queue('a', 'b', 'c', 'd') a a b b c c d d 中的setter方法,因为你不使用它们,我们通常不写getter&amp;像Python那样的setter。请参阅文档中的Descriptor HowTo Guide

FWIW,我会让Node成为一个单独的类(或完全摆脱它),而不是将其嵌套在Node中。我想嵌套它并没有什么坏处,但嵌套的类定义在Python中并不经常使用。

BTW,collections.deque是一个非常有效的双端队列。对于简单的队列和堆栈,它通常比LinkedQueue更快。但我想这个list类是用于在Python中实现链表的练习,因此LinkedQueue目前不适合您。 ;)