【问题标题】:Printing elements in a linked list queue打印链表队列中的元素
【发布时间】:2018-07-22 06:55:18
【问题描述】:

我在 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    

【问题讨论】:

  • 您是否看过仅使用python listappend()pop() 方法?

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


【解决方案1】:

这取决于您希望代表的样子,但这是一种方法。我们给_Node 类提供一个简单的__repr__,它只返回元素的repr,并为LinkedQueue 实例构建repr,我们遍历链表,将每个Node 的repr 存储到一个列表中。然后我们可以调用该列表上的.join 来为LinkedQueue 进行repr。

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

我去掉了Node 中的getter 和setter 方法,因为你不使用它们,而且我们通常不会在Python 中编写这样的getter 和setter。请参阅文档中的 Descriptor HowTo Guide

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

顺便说一句,collections.deque 是一个非常有效的双端队列。对于简单的队列和堆栈,它通常比list 更快。但我猜这个LinkedQueue 类是用于在Python 中实现链表的练习,所以collections.deque 目前与您无关。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2015-07-28
    • 2011-10-11
    • 2017-03-31
    相关资源
    最近更新 更多