python queue.peek()
时间: 2024-01-13 13:17:08 浏览: 315
根据提供的引用,Python中的Queue类没有peek()方法。但是,可以使用Queue类的内置方法size()和dequeue()来模拟peek()方法。size()方法返回队列的大小,而dequeue()方法返回队列的第一个元素,但不会将其从队列中删除。因此,可以使用这两个方法来实现peek()方法。具体实现如下:
```
class Queue:
"""模拟队列"""
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def enqueue(self, item):
self.items.insert(0,item)
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
def peek(self):
if not self.isEmpty():
return self.items[-1]
```
在上面的代码中,peek()方法返回队列的最后一个元素,即下一个要被弹出的元素,但不会将其从队列中删除。如果队列为空,则返回None。
相关问题
优化代码:class BiTreeNode: def __init__(self, data=None): self.data = data self.l_child = None self.r_child = None class BiTree(object): def __init__(self, root=None): self.r_child = None self.l_child = None self.root = root @classmethod def createBiTree(cls, order): q = LinkQueue() root = BiTreeNode() bt = BiTree(root) q.offer(root) for i in range(len(order)): c = order[i] node = q.peek() if node.l_child is None: newNode = BiTreeNode(c) node.l_child = newNode q.offer(newNode) elif node.r_child is None: newNode = BiTreeNode(c) node.r_child = newNode q.offer(newNode) q.poll() return bt
可以考虑对代码进行如下优化:
1. 可以将BiTree类中的r_child和l_child属性移除,因为这两个属性在BiTreeNode类中已经定义了。
2. 可以将createBiTree方法改为实例方法,因为它需要访问实例属性root。
3. 可以将LinkQueue替换为Python内置的queue.Queue,这样可以避免引入外部依赖。
4. 可以将LinkQueue.offer和LinkQueue.poll方法改为queue.Queue.put和queue.Queue.get方法,因为它们的功能是相同的。
5. 可以将循环中的len(order)提前计算出来,这样可以避免在每次循环时都重新计算长度。
改进后的代码如下:
```
from queue import Queue
class BiTreeNode:
def __init__(self, data=None):
self.data = data
self.l_child = None
self.r_child = None
class BiTree(object):
def __init__(self, root=None):
self.root = root
def createBiTree(self, order):
q = Queue()
root = BiTreeNode()
self.root = root
q.put(root)
order_len = len(order)
for i in range(order_len):
c = order[i]
node = q.get()
if node.l_child is None:
newNode = BiTreeNode(c)
node.l_child = newNode
q.put(newNode)
elif node.r_child is None:
newNode = BiTreeNode(c)
node.r_child = newNode
q.put(newNode)
return self
```
优化后的代码使用Python内置的Queue代替了LinkQueue,简化了代码。同时也将BiTree类的r_child和l_child属性移除,减少了代码冗余。
class BiTreeNode: def __init__(self, data=None): self.data = data self.l_child = None self.r_child = None class BiTree(object): def __init__(self, root=None): self.r_child = None self.l_child = None self.root = root @classmethod def createBiTree(cls, order): q = LinkQueue() root = BiTreeNode() print("节点个数") bt.nodeCount(bt.root) print() bt = BiTree(root) q.offer(root) for i in range(len(order)): c = order[i] node = q.peek() if node.l_child is None: newNode = BiTreeNode(c) node.l_child = newNode q.offer(newNode) elif node.r_child is None: newNode = BiTreeNode(c) node.r_child = newNode q.offer(newNode) q.poll() return bt def Order(self, root): q = LinkQueue() q.offer(root) while not q.isEmpty(): p = q.poll() print(p.data, end='') if p.l_child is not None: q.offer(p.l_child) if p.r_child is not None: q.offer(p.r_child) def nodeCount(t): count = 0 if t is not None: count += 1 count += nodeCount(t.l_child) count += nodeCount(t.r_child) return count
代码中存在两个问题:
1. 在createBiTree方法中,先调用了bt.nodeCount方法,再将root节点传入BiTree类的构造方法中,这会导致nodeCount方法中的t参数为None,从而导致程序抛出异常。
2. nodeCount方法应该是BiTree类的方法,而不是独立的函数。因此,应该将nodeCount方法移动到BiTree类中,并将其改为实例方法。
修改后的代码如下:
```
from queue import Queue
class BiTreeNode:
def __init__(self, data=None):
self.data = data
self.l_child = None
self.r_child = None
class BiTree(object):
def __init__(self, root=None):
self.root = root
@classmethod
def createBiTree(cls, order):
q = Queue()
root = BiTreeNode()
bt = BiTree(root)
q.put(root)
for i in range(len(order)):
c = order[i]
node = q.get()
if node.l_child is None:
newNode = BiTreeNode(c)
node.l_child = newNode
q.put(newNode)
elif node.r_child is None:
newNode = BiTreeNode(c)
node.r_child = newNode
q.put(newNode)
return bt
def Order(self, root):
q = Queue()
q.put(root)
while not q.empty():
p = q.get()
print(p.data, end='')
if p.l_child is not None:
q.put(p.l_child)
if p.r_child is not None:
q.put(p.r_child)
def nodeCount(self, t):
count = 0
if t is not None:
count += 1
count += self.nodeCount(t.l_child)
count += self.nodeCount(t.r_child)
return count
```
修改后的代码中,将nodeCount方法移动到BiTree类中,并将其改为实例方法。同时,将createBiTree方法中的节点计数移动到Order方法中,确保root节点已经被正确初始化。另外,将LinkQueue替换为Python内置的Queue。
阅读全文