題目描述
用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素爲int類型。
知識點
棧和隊列(先進後出和先進先出)
分析
邊界條件:由於輸入int型,無邊界條件
自己的思路
push操作:若棧2爲空,則直接往裏push。若不爲空,則先把棧2的元素依次出棧到棧1中,把新元素push到棧2,再把棧1的元素依次出棧到棧2中。通過這樣的方式,保證每次入棧後新入棧的數據都是在最底層,最老的數據都是在最頂層。
pop操作:直接pop棧2的元素即可。
複雜度
push 時間O(n) ,空間複雜度O(1)
pop 時間O(1), 空間O(1)
代碼
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
while(!stack2.isEmpty()){
stack1.push(stack2.pop());
}
stack2.push(node);
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
public int pop() {
return stack2.pop();
}
}
優化
看了別人的解法,可以將push和pop的時間複雜度降到O(1)
思路
push操作就直接入棧,不再進行元素的挪動,比如都如棧1;
pop操作需要判斷棧2是否爲空,若爲空,則把棧1的元素依次推入棧2,並出棧頂元素。若不爲空,則出棧2 頂部的元素。空了之後又把棧1的轉過來,再出棧2的。
總結
關鍵點:對棧和隊列兩種數據結構的認識。優化的點在於後一種思路避免了每一次入棧都要挪動棧中的所有元素。