由兩個棧組成的隊列

題目

使用棧實現隊列的下列操做:程序員

push(x) -- 將一個元素放入隊列的尾部。
pop() -- 從隊列首部移除元素。
peek() -- 返回隊列首部的元素。
empty() -- 返回隊列是否爲空。

示例:算法

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);  
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

說明:app

  • 你只能使用標準的棧操做 -- 也就是隻有 push to top, peek/pop from top, size, 和 is empty 操做是合法的。
  • 你所使用的語言也許不支持棧。你能夠使用list或者deque(雙端隊列)來模擬一個棧,只要是標準的棧操做便可。
  • 假設全部操做都是有效的 (例如,一個空的隊列不會調用 pop 或者 peek 操做)。

思路

設計時使用兩個棧
一個棧做爲壓入棧,記爲stack_in
一個棧做爲彈出棧,記爲stack_out設計

1.當有數據入隊列時,壓入stack_incode

2.當有數據出隊列時,從stack_out彈出,若是stack_out爲空,則循環遍歷stack_in,將stack_in中的元素所有彈出,並按彈出順序所有壓入棧stack_out,循環結束後從stack_out彈出棧頂元素便可隊列

代碼

class MyQueue:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.stack_in = []
        self.stack_out = []
        

    def push(self, x: int) -> None:
        """
        Push element x to the back of queue.
        """
        self.stack_in.append(x)

    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        if not self.stack_out:
            while self.stack_in:
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()
        else:
            return self.stack_out.pop()
        

    def peek(self) -> int:
        """
        Get the front element.
        """
        if not self.stack_out:
            while self.stack_in:
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out[-1]
        else:
            return self.stack_out[-1]
        

    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        if self.stack_out or self.stack_in:
            return False
        else:
            return True

複雜度分析

入隊內存

  • 時間複雜度:O(1):向棧壓入元素的時間複雜度爲O(1)element

  • 空間複雜度:O(n):須要額外的內存來存儲隊列元素it

出隊class

  • 時間複雜度: 攤還複雜度 O(1),最壞狀況下的時間複雜度 O(n)
    在最壞狀況下,stack_out爲空,算法須要從 stack_in 中彈出 n 個元素,而後再把這 n個元素壓入 stack_out

  • 空間複雜度 :O(1)


公衆號:《程序員養成記》 

主要寫算法、計算機基礎之類的文章, 有興趣來關注一塊兒成長!

相關文章
相關標籤/搜索