面試題7:用兩個棧來實現一個隊列,完成隊列的Push和Pop操做。 隊列中的元素爲int類型。java
牛客網 OJ:用兩個棧實現隊列node
因爲棧是後進先出的,爲了實現隊列的先進先出特性,那麼兩個棧中,stack1 用來實現 push。當該仿真隊列
不斷執行 push 操做時,元素一個個被壓到棧中,此時的順序是最早的元素在棧的最底部,順序和隊列元素相反。
當要彈出元素時,咱們指望將 stack1 的數據逆序輸出去,即從棧底開始依次彈出,此時就得藉助 stack2 了。
執行仿真隊列的 pop 操做時,將 stack1 的元素所有 pop 出來並壓入 stack2,此時 stack2 就變成棧底
是最後 push 進隊列(最後 push 到 stack1)、棧頂是最早 push 到隊列(最早 push 到 stack1)的元素
順序,對 stack2 直接 pop 就是指望的隊列元素。
間接實現了隊列的先進先出特性。
複製代碼
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if(stack1.isEmpty() && stack2.isEmpty()) {
throw new RuntimeException("Queue is empty!");
}
if(!stack2.isEmpty()) {
return stack2.pop();
}
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
複製代碼
棧和隊列這兩種數據結構能夠互相用來實現對方,但必須多出同類型的一個輔助數據結構才行。面試
每次 push 進 Queue1, 都是先進先出的序列,而 pop 時要求實現後進先出,因爲隊列只能最早進的從隊列頭最早
彈出,此時,能夠將 Queue1 的元素,所有 pop 出來,經過一個變量 element 來暫存 Queue1 中的最後一個元
素,在這個過程當中,將彈出的元素 push 到 Queue2(除 Queue1 最後一個元素),返回的 element 就是最後 push
到隊列的值,至關於棧頂元素,間接實現棧的後進先出特性。
若是此時要繼續 pop 出仿真棧的下一個元素,則模仿上一步,將 Queue2 全部元素,除了最後一個元素都 pop 出來,
並 push 進 Queue1, 這個過程當中一樣經過 element 這個變量來保存 Queue2 的最後一個元素,返回該元素即棧
頂元素。
注意:每次 pop 都最終保證一個 Queue 爲空。
如此交替裝元素,一個做爲發射槍發射子彈,另外一個做爲容器裝這個發射槍的發出的子彈。
複製代碼
import java.util.Queue;
public class Solution {
Queue<Integer> queue1 = new Queue<Integer>();
Queue<Integer> queue2 = new Queue<Integer>();
public void push(int node) {
if(queue1.size() != 0) {
queue1.add(node);
} else if(queue2.size() != 0) {
queue2.add(node);
} else {
queue1.add(node);
}
}
public int pop()() {
if(queue1..size() == 0 && queue2..size() == 0) {
return new RuntimeException("Stack is empty!");
}
int element;
if(queue1.size() != 0) {
while(queue1.size() > 0){
element = queue1.poll();
if(queue1.size() != 0) {
queue2.add(element);
}
}
} else {
while(queue2.size() > 0) {
element = queue2.poll();
if(queue2.size() != 0) {
queue1.add(element);
}
}
}
return element;
}
}
複製代碼