1.棧(stacks)是一種只能經過訪問其一端來實現數據存儲與檢索的線性數據結構,具備後進先出(last in first out,LIFO)的特徵node
2.隊列(queue)是一種具備先進先出特徵的線性數據結構,元素的增長只能在一端進行,元素的刪除只能在另外一端進行。可以增長元素的隊列一端稱爲隊尾,能夠刪除元素的隊列一端則稱爲隊首。數據結構
stack = [3, 4, 5] stack.append(2) stack.append(6) print(stack) stack.pop() print(stack) stack.pop() print(stack)
[3, 4, 5, 2, 6] [3, 4, 5, 2] [3, 4, 5]
from collections import deque queue = deque(["Eric", "John", "Michael"]) print(queue) queue.append("Terry") # Terry arrives queue.append("Graham") # Graham arrives print(queue) queue.popleft() # The first to arrive now leaves queue.popleft() # The second to arrive now leaves deque(['Michael', 'Terry', 'Graham']) print(queue)
deque(['Eric', 'John', 'Michael']) deque(['Eric', 'John', 'Michael', 'Terry', 'Graham']) deque(['Michael', 'Terry', 'Graham'])
建立兩個棧stack1和stack2,使用兩個「先進後出」的棧實現一個「先進先出」的隊列。app
咱們經過一個具體的例子分析往該隊列插入和刪除元素的過程。首先插入一個元素a,不妨先把它插入到stack1,此時stack1中的元素有{a},stack2爲空。再壓入兩個元素b和c,仍是插入到stack1中,此時stack1的元素有{a,b,c},其中c位於棧頂,而stack2仍然是空的。code
這個時候咱們試着從隊列中刪除一個元素。按照先入先出的規則,因爲a比b、c先插入隊列中,最早刪除的元素應該是a。元素a存儲在stack1中,但並不在棧頂,所以不能直接進行刪除操做。注意stack2咱們一直沒有使用過,如今是讓stack2發揮做用的時候了。若是咱們把stack1中的元素逐個彈出壓入stack2,元素在stack2中的順序正好和原來在stack1中的順序相反。所以通過3次彈出stack1和要入stack2操做以後,stack1爲空,而stack2中的元素是{c,b,a},這個時候就能夠彈出stack2的棧頂a了。此時的stack1爲空,而stack2的元素爲{b,a},其中b在棧頂。隊列
所以咱們的思路是:當stack2中不爲空時,在stack2中的棧頂元素是最早進入隊列的元素,能夠彈出。若是stack2爲空時,咱們把stack1中的元素逐個彈出並壓入stack2。因爲先進入隊列的元素被壓倒stack1的棧底,通過彈出和壓入以後就處於stack2的棧頂,有能夠直接彈出。若是有新元素d插入,咱們直接把它壓入stack1便可。it
class Solution: def __init__(self): self.stack1 = [] self.stack2 = [] self.result = [] def push(self, node): # write code here self.stack1.append(node) self.result = self.stack1 + self.stack2 def pop(self): # return xx if len(self.stack2) == 0: while self.stack1: self.stack2.append(self.stack1.pop()) self.result = self.stack2 return self.stack2.pop() a = Solution() a.push(1) a.push(2) a.push(3) a.push(4) print(a.result) a.pop() print(a.result) a.pop() print(a.result)
[1, 2, 3, 4] [4, 3, 2] [4, 3]