劍指Offer題目7:用兩個棧來實現一個隊列(Java)

面試題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;
    }
}
複製代碼
相關文章
相關標籤/搜索