1. 程式人生 > >劍指offer:用兩個棧實現一個隊列

劍指offer:用兩個棧實現一個隊列

ack 特性 壓入 [] elf 即將 init 出隊 劍指offer

題目描述
用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。

類似漢諾塔,當我們需要將棧A下面的元素出棧的時候可以先將棧A中的元素全部逆序壓入到另一個棧B,這時棧B保存的就是棧A的逆序,也就是滿足了FIFO的要求

class Solution:
    """
    用兩個棧模擬一個隊列,如果兩個棧的容量分別為M和N,其中M > N,那麽模擬得到的隊列的容量是2N+1
    因為假設先把stack2塞滿N個,然後此時stack1塞進N+2個,那麽此時將元素出隊,當stack2的元素全
    部出棧之後,將stack1的後N個元素壓入stack2,此時stack1還有2個元素,且這兩個元素是即將要出隊
    的兩個元素,最先要出隊的元素在下面,沒辦法按順序出隊,不滿足隊列的特性。因此最大容量是2N+1
    """
    def __init__(self):
        self.stack1 = []  # stack1用來保存進隊的元素
        self.stack2 = []  # stack2用來保存將要出隊的元素

    def push(self, node):
        self.stack1.append(node)

    def pop(self):
        if not self.stack1 and not self.stack2:
            return None
        if not self.stack2:  # 當stack2為空的時候將stack1的元素逆序壓入
            while self.stack1:
                self.stack2.append(self.stack1.pop(-1))
        return self.stack2.pop(-1)

劍指offer:用兩個棧實現一個隊列