用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 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:做過的題目;使用一個棧,插入時直接進入棧頂;刪除時需要把全部元素彈出並插入到臨時棧中,此時要刪除的元素在臨時棧棧頂,刪除即可;然後重新插入回原棧中。
代碼1:
class CQueue {
public:
stack<int> st;
CQueue() {}
void appendTail(int value) {
st.push(value);
}
int deleteHead() {
if (st.empty()) return -1;
stack<int> temp;
while (!st.empty()) {
temp.push(st.top());
st.pop();
}
int ans = temp.top(); temp.pop();
while (!temp.empty()) {
st.push(temp.top());
temp.pop();
}
return ans;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
效率:耗費空間少,但是時間慢,因爲在刪除元素時浪費了太多時間。
執行用時:1300 ms, 在所有 C++ 提交中擊敗了5.89% 的用戶
內存消耗:212 MB, 在所有 C++ 提交中擊敗了100.00% 的用戶
思路2:使用 input
和 output
兩個棧。刪除元素時僅需刪除 output
棧頂元素即可。
代碼2:
class CQueue {
public:
stack<int> input, output;
CQueue() {}
void appendTail(int value) {
input.push(value);
}
int deleteHead() {
if (input.empty() && output.empty()) return -1;
if (output.empty()) {
while (!input.empty()) {
output.push(input.top());
input.pop();
}
}
int ans = output.top(); output.pop();
return ans;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
效率:
執行用時:728 ms, 在所有 C++ 提交中擊敗了55.06% 的用戶
內存消耗:103.6 MB, 在所有 C++ 提交中擊敗了100.00% 的用戶