我在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
答案 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
目前不适合您。 ;)