2016-03-15 70 views
1

我已经使用自制的类节点定义了一个类Queue。我认为它按预期工作,但我不确定代码是否正确。大多数情况下,我很担心在队列为空时将self.first和self.last分配给p(新节点)。我的推理是,因为p将是唯一的节点,它将是第一个节点和最后一个节点,但这可能不是思考的Pythonic方式。我的代码是否合理?已连接的队列类

class Node: 
    def __init__(self): 
     self.value=0 
     self.next=None 
class Queue: 
    def __init__(self): 
     self.first=None 
     self.last=None 
    def isempty(self): 
     return self.first==None 
    def put(self,x): 
     p=Node() 
     p.value=x 
     if self.first==None: 
      self.first=p 
      self.last=p 
     else: 
      self.last.next=p 
      self.last=p 
    def get(self): 
    if self.isempty(): 
     print('Queue is empty!') 
    else: 
     x=self.first.value 
     self.first=self.first.next 
     return x 
+0

当您将第一个和最后一个节点分配为同一个节点时,基本上将其设置为循环队列。 – Muctadir

+0

@Muctadir这就是我所害怕的。我应该将最后一个节点分配给什么? – Lozansky

+0

和muctadir,那不正确。循环链接就像'self.first.next = self.first'。在同一个节点上同时拥有两个指针是完全正确的。 – Maresh

回答

1

那么这里有一个问题,你会在第一次打电话之后松开Head指针,或者是故意的?

def get(self): 
    try: 
     x=self.first.value 
     self.first=self.first.next 
     return x 
    except AttributeError: 
     print('Empty queue!') 

此外,而不是捕捉AttributeError为什么不使用self.isempty()方法。

关于self.last:它似乎并不像你需要它。

我会修改如下节点:

class Node: 
def __init__(self, val=0): 
    self.value= val 
    self.next = None 

所以,你可以写:

def put(self,x): 
    p = Node(x) 

下面可以缩短一点: 来源:

if self.first==None: 
     self.first=p 
     self.last=p 
    else: 
     self.last.next=p 
     self.last=p 

要:

if self.first==None: 
     self.first=p 
    else: 
     self.last.next=p 
    self.last=p 

这是一个有点奇怪我使用链表作为队列,但嘿,为什么不:)

备注代码样式: 使用更多的空间,并尽量遵守https://www.python.org/dev/peps/pep-0008/ 您可以运行flake8或者你的代码pylint的通过实践学习(而不是阅读PEP ;-))

编辑:

新得到的是好的。你可以避免这样的else。作为一个经验法则不太条件语句/范围越好:

if self.isempty(): 
    print('Queue is empty!') 
    return None 

x = self.first.value 
self.first = self.first.next 
return x 

对于你的问题有关val=0,这就是所谓的默认参数,因此,如果调用Node()没有指定val这将是0反正。

n = Node() 
print(n.val) 
>> 0 
n = Node(42) 
print(n.val) 
>> 42 
+0

什么是“头指针”?我刚开始学习堆栈/队列,这个术语还没有提出来。 我编辑了get方法的改变。请告诉我,如果它更好。 你能告诉我为什么把val = 0作为__init __-方法的参数吗? – Lozansky

+0

不用担心它的行话。列表的第一个和最后一个元素通常分别称为头部和尾部。 – Maresh

+0

我提前输入。我添加了一些更多的东西给我的评论! – Lozansky