LeetCode-劍指offer-09-用兩個棧實現佇列
阿新 • • 發佈:2021-02-06
目錄
題目要求
用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式 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類。
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();
}
}