python - 打印链表队列中的元素

标签 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    

最佳答案

这取决于您希望代表的外观,但这是一种方法。我们为 _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 目前与您无关。 ;)

关于python - 打印链表队列中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48740806/

相关文章:

python - 是否需要为他们定位的每个站点编写爬虫?

python - 异常:TypeError(字符串索引必须是整数)

java - RegEx : Where should I start? 之后分割 PDF

python - 在python中解析双管道分隔文件

python - 将字符串拆分为 2 个字母的段

python - 在从 __init__ 调用的函数中声明变量是否仍然使用 key 共享字典?

c++ - p->next->prev 和 p 一样吗?

python - 无法使用正则表达式获取图像路径

algorithm - 创建包含具有特定显示顺序的其他列表元素的列表

c - 理解 C 中的链表