LeetCode--用兩個棧實現佇列
阿新 • • 發佈:2021-01-26
技術標籤:leetcode
題目描述
用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式 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 次呼叫
思路
佇列是先進先出的資料結構,棧是先進後出的資料結構,怎麼使用棧完成佇列的功能?
對一個空棧來說,先壓入全部資料,然後彈出所有資料,就完成了一次資料的反序,例如輸入陣列[1, 7, 3]
,彈出時就變成了[3, 7, 1]
。可見如果使用一個棧+一個輔助棧,進行兩次反序,就可以完成佇列的功能。當然,這道題在這個基礎上還是要更復雜一些,上面是假設一下壓入全部資料,然後一下彈出所有資料的情況
- s1與s2全空又要“出佇列”時,返回-1
- "出佇列"時,保證輔助棧已經全為空,然後將原棧所有元素灌入輔助棧後,再依次出棧即可
題解
用C++和Java完成兩種實現,思路完全相同
c++
CQueue.h
#include<stack>
using namespace std;
class CQueue {
stack<int> s1, s2;
public:
CQueue() {
stack<int> s1;
stack<int> s2;
}
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
if (s2.empty()) { /*要保證s2是空棧才正確*/
while (!s1.empty()) {
s2.push(s1.top());
s1.pop();
}
}
if (s2.empty())
return -1;
else {
int temp = s2.top();
s2.pop();
return temp;
}
}
};