2016-11-20 41 views
0

這段代碼來自hackerrank.com。爲什麼隊列的窺視功能會刪除最後一項並追加它?

def pop(self): 
    #looks at the top of the queue 
    if len(self.stack2) > 0: 
     top = self.stack2.pop() 
     self.stack2.append(top) 

有人能解釋爲什麼它彈出堆棧/隊列中的最後一項,然後只是追加它?我在隊列中想,這是第一次進入。在這種情況下,隊列中的「top」項應該是self.stack2.pop(0)

+0

要看什麼實現的其餘部分這樣做。例如,你可以實現一個隊列,在其中添加新元素作爲列表的開始,並從末尾「彈出」讀取。 – Batman

回答

1

如果你指的是this代碼:

def peek(self): 
    if len(self.stack2) > 0: 
     top = self.stack2.pop() 
     self.stack2.append(top) 
    else: 
     while(len(self.stack1) > 1): 
      self.stack2.append(self.stack1.pop()) 
     top = self.stack1.pop() 
     self.stack2.append(top) 
    return top 

...那麼線索就在名稱:兩線有問題彈出一個值過的self.stack2頂部,將其存儲在變量top ,然後將其推回到堆棧的頂部,以便堆棧保持不變,並且可以在方法的最後一行返回該值。因此,名稱peek,如「在堆棧中查看最高值而不會永久改變任何內容」。

的代碼的其餘部分,包括peek()else條款,是經典的實現雙堆棧隊列的,詳細解釋在這裏:

https://stackoverflow.com/a/39089983

+0

那麼爲什麼我們不能只使用top = self.stack2 [-1]或其他東西來找出棧頂,而不是pop和append? – jessibird

+1

[練習](https://www.hackerrank.com/challenges/ctci-queue-using-two-stacks)是使用兩個[stacks]實現一個隊列(https://en.wikipedia.org/wiki/stack_(abstract_data_type)),所以作者試圖只使用保證可用於堆棧的兩個操作:push(在Python列表中稱爲「append」)和「pop」(雖然它們也可能被欺騙使用'len')。 –

相關問題