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