劍指Offer 面試題09. 用兩個棧實現隊列

面試題09. 用兩個棧實現隊列

用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail 和 deleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 )

示例 1:

輸入:

[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]

輸出:

[null,null,3,-1]

示例 2:

輸入:

[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]

輸出:

[null,-1,null,null,5,2]

提示:

1 <= values <= 10000
最多會對 appendTail、deleteHead 進行 10000 次調用

解題思路

瞭解棧和隊列的特性

此圖來源網絡
在這裏插入圖片描述

棧:後進先出(LIFO-last in first out):最後插入的元素最先出來。
隊列:先進先出(FIFO-first in first out):最先插入的元素最先出來。

題目給出,用兩個棧實現一個隊列,只需要一個存儲數據,另一個做輔助可完成此題。

在這裏插入圖片描述

package Leetcode;

import java.util.Stack;

public class CQueue {

    private Stack<Integer> stack = null;
    private Stack<Integer> stack2 = null;


    public CQueue() {
        stack = new Stack<>();
        stack2 = new Stack<>();
    }

    //隊列尾部插入整數
    public void appendTail(int value) {
        stack.push(value);
    }

    //隊列頭部刪除整數
    public int deleteHead() {
        //如果棧2中的元素爲空
        if(stack2.empty()){
            //就遍歷棧1中的所有元素
            while (!stack.empty()){
                //每次遍歷都取出並存儲棧2中
                stack2.push(stack.pop());
            }
        }

        //如果棧2有元素數據就彈出返回,否則就返回-1
        return stack2.empty()?-1:stack2.pop();
    }

    public static void main(String[] args) {
        CQueue cQueue = new CQueue();
        System.out.println(cQueue.deleteHead());

        cQueue.appendTail(5);
        cQueue.appendTail(2);

        System.out.println(cQueue.deleteHead());
        System.out.println(cQueue.deleteHead());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章