2016-03-15 72 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