LeetCode232. 用棧實現佇列
阿新 • • 發佈:2018-12-26
使用棧實現佇列的下列操作:
- push(x) -- 將一個元素放入佇列的尾部。
- pop() -- 從佇列首部移除元素。
- peek() -- 返回佇列首部的元素。
- empty() -- 返回佇列是否為空。
示例:
MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false
說明:
- 你只能使用標準的棧操作 -- 也就是隻有
push to top
,peek/pop from top
,size
is empty
操作是合法的。 - 你所使用的語言也許不支援棧。你可以使用 list 或者 deque(雙端佇列)來模擬一個棧,只要是標準的棧操作即可。
- 假設所有操作都是有效的 (例如,一個空的佇列不會呼叫 pop 或者 peek 操作)。
題目分析:用兩個棧實現一個佇列,假設有兩個棧s1,s2,當執行入隊操作時,將元素放進棧s1;當執行出隊操作時,將棧s2的棧頂元素彈出,如果棧s2為空的話,先將棧s1的所有元素依次彈出並放入s2,再將s2的棧頂元素彈出。判斷佇列為空的話,只要判斷兩個棧是否都為空,若都為空,則佇列為空,否則佇列不為空。返回隊首元素和出隊操作類似,返回棧s2的棧頂元素即可,若棧s2為空,則將棧s1的元素全部壓棧,再返回s2棧頂元素。
程式碼展示:
class MyQueue { public: /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { s1.push(x); } /** Removes the element from in front of queue and returns that element. */ int pop() { if(s2.empty()){ while(!s1.empty()){ s2.push(s1.top()); s1.pop(); } } int temp = s2.top(); s2.pop(); return temp; } /** Get the front element. */ int peek() { if(s2.empty()){ while(!s1.empty()){ s2.push(s1.top()); s1.pop(); } } return s2.top(); } /** Returns whether the queue is empty. */ bool empty() { if(s1.empty() && s2.empty()) return true; else return false; } private: stack<int> s1; stack<int> s2; }; /** * Your MyQueue object will be instantiated and called as such: * MyQueue obj = new MyQueue(); * obj.push(x); * int param_2 = obj.pop(); * int param_3 = obj.peek(); * bool param_4 = obj.empty(); */