最小棧 leetcode 232.
題目大意:僅使用兩個棧實現一個佇列,要求實現push、pop、peek、empty
解題思路:棧和佇列剛好想法,佇列是先進先出,設定a佇列正常存放,b佇列存放倒序,push的操作正常存放進a佇列,pop的操作需要倒序,peek也需要倒序,將判斷方法放置於peek中,peek操作不會操作具體佇列,需要判定三個情況,b佇列有值那就是b佇列的peek值,否則判斷a佇列是否有值,都沒有就是空的,最後就是將a佇列的值pop出來push進b佇列實現倒序儲存,empty方法就是兩個佇列均為空,pop的話,首先執行一下peek函式,作為最終返回值,在這中間需要將b佇列執行一下pop操作。
題解及註釋:
class MyQueue {
private Stack<Integer> a;
private Stack<Integer> b;
public MyQueue() {
a = new Stack<Integer>();
b = new Stack<Integer>();
}
public void push(int x) {
a.push(x);
}
public int pop() {
int peek = peek();
b.pop();
return peek;
}
public int peek() {
if (!b.empty()) return b.peek();
if (a.empty()) return -1;
while (!a.empty()) {
b.push(a.pop());
}
return b.peek();
}
public boolean empty() {
return a.empty() && b.empty();
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
總結:題解寫出來後其實基本上都已經熟悉了,為什麼pop的時候不直接返回b.pop(),因為特殊情況只是在peek()做了處理,但是返回值是存放在pop()中的peek值裡的,所以最終要返回該peek值