1. 程式人生 > 其它 >LeetCode-劍指offer-09-用兩個棧實現佇列

LeetCode-劍指offer-09-用兩個棧實現佇列

技術標籤:LeetCode劍指offer刷題記錄佇列

目錄


題目要求

原題連結劍指 Offer 09. 用兩個棧實現佇列

用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式 appendTail 和 deleteHead ,分別完成在佇列尾部插入整數和在佇列頭部刪除整數的功能。(若佇列中沒有元素,deleteHead 操作返回 -1 )

示例 1

輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]

示例 2

輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
輸出:[null,-1,null,null,5,2]

提示

  • 1 <= values <= 10000
  • 最多會對 appendTail、deleteHead 進行 10000 次呼叫

解題過程

按照題目要求使用兩個棧 | 時間複雜度: O ( n ) O(n) O

(n) | 空間複雜度: O ( n ) O(n) O(n)

注意:Java中的棧模擬一般用Deque,因為Satck繼承於Vector類,而Vector是執行緒安全的,會影響效能,所以優先使用執行緒不安全的Deque類。

image-20210205215655072

class CQueue {
    // 1. 一開始兩個棧都是空的
    Deque<Integer> stack1 = new LinkedList<>();
    Deque<Integer> stack2 = new LinkedList<>();

    public CQueue() {

    }
    // 2. 每次在末尾新增元素,都直接往stack1裡壓
public void appendTail(int value) { stack1.push(value); } // 3. 彈出頭部元素的時候,每次優先從stack2中開始彈出 // (while迴圈的操作就是預設stack2中的棧頂元素就是佇列的頭部元素了,因為將stack1中的元素逆序存放在stack2中) public int deleteHead() { // stack2不為空,則一直從stack2彈出 if(!stack2.isEmpty()) return stack2.pop(); // 當stack2完全為空的時候,才可以將元素從stack1彈出再壓入stack2 while(!stack1.isEmpty()) stack2.push(stack1.pop()); // 如果此時stack2還未空的話,說明stack1和stack2都沒有元素了,即隊裡中沒有元素 if(stack2.isEmpty()) return -1; // 否則彈出stack2的棧頂元素 else return stack2.pop(); } }