最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?棧與隊列實戰(zhàn)真題訓練

 更新時間:2022年04月02日 08:48:06   作者:Pretend..  
在編寫程序的時候,對于棧與隊列的應用需要熟練的掌握,這樣才能夠確保寫出來的代碼有質(zhì)量。本文小編就以幾個題目詳細說說Java中的棧與隊列,需要的朋友可以參考一下

1、實現(xiàn)循環(huán)隊列

【OJ鏈接】

循環(huán)隊列一般通過數(shù)組實現(xiàn)。我們需要解決幾個問題。

(1)數(shù)組下標實現(xiàn)循環(huán)

a、下標最后再往后(offset 小于 array.length): index = (index + offset) % array.length。通俗一點,就是如果我們的數(shù)組大小為8,下標走到了7,再往后如何回到0,我們可以(index+1)%8來實現(xiàn)。

b、下標最前再往前的時候,我們特殊判斷一下,將其置為數(shù)組大小減一即可。

(2)區(qū)分隊列的滿與空

我們可以給數(shù)組預留一個位置,如果rear+1=front,則表示隊列已滿;如果rear=front,表示隊列為空。這個情況下,我們需要考慮隊列大小的問題,在定義數(shù)組大小時,需要比原有的大一。

 【代碼如下】

class MyCircularQueue {
    public int front;
    public int rear;
    public int[] array;
 
    //構(gòu)造方法
    public MyCircularQueue(int k) {
       //因為預留位置的緣故,數(shù)組的大小要定義為k+1
       this.array=new int[k+1];
    }
    //入隊
    public boolean enQueue(int value) {
        if(isFull()){
            return false;
        }
        this.array[this.rear]=value;
        this.rear=(this.rear+1)%this.array.length;
        return true;
    }
    //出隊
    public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        this.front=(this.front+1)%this.array.length;
        return true;
    }
    //獲取隊頭
    public int Front() {
        if(isEmpty()){
            return -1;
        }
        return this.array[front];
    }
    //獲取隊尾
    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        int index=-1;
        if(this.rear==0){
            index=this.array.length-1;
        }else{
            index=this.rear-1;
        }
        return this.array[index];
    }
    //判斷是否為空
    public boolean isEmpty() {
        if(this.front==this.rear){
            return true;
        }
        return false;
    }
    //判斷隊列是否滿
    public boolean isFull() {
        if((this.rear+1)%this.array.length==this.front){
            return true;
        }
        return false;
    }
}

2、隊列實現(xiàn)棧

【OJ鏈接】

因為棧的先進后出、隊列的先進先出原則。我們需要兩個隊列來實現(xiàn)棧。當兩個隊列都為空時,棧為空。

  • 入棧(push):第一次入棧無所謂,兩個隊列都為空,隨便選擇一個隊列入隊即可;后面入棧時,肯定會有一個隊列不為空,找到不為空的隊列,進行入隊操作。
  • 出棧(pop):首先棧為空時,不能進行出棧操作;棧不為空時,肯定有一個隊列為空(queue1),一個隊列不為空(queue2),將queue1中的size-1個元素出棧到queue2中(特別注意不能將求queue1大小的函數(shù)放進循環(huán)里,queue進行出隊操作時,其大小是改變的),最后將queue1中最后一個元素進行出隊最為返回值。
  • 獲取棧頂元素(top):和出棧差不多,就不細說了

【代碼如下】

class MyStack {
    private Queue<Integer> queue1;
    private Queue<Integer> queue2;
 
    //構(gòu)造方法
    public MyStack() {
        queue1=new LinkedList<>();
        queue2=new LinkedList<>();
    }
    //入棧
    public void push(int x) {
        if(!queue2.isEmpty()){
            queue2.offer(x);
        }else{
            queue1.offer(x);
        }
    }
    //出棧
    public int pop() {
        if(empty()){
            return -1;
        }
        if(queue1.isEmpty()){
            int size=queue2.size();
            for(int i=0;i<size-1;++i){
                int x=queue2.poll();
                queue1.offer(x);
            }
            return queue2.poll();
        }else{
            int size=queue1.size();
            for(int i=0;i<size-1;++i){
                int x=queue1.poll();
                queue2.offer(x);
            }
            return queue1.poll();
        }
    }
    //獲取棧頂元素
    public int top() {
        if(empty()){
            return -1;
        }
        if(queue1.isEmpty()){
            int x=-1;
            int size=queue2.size();
            for(int i=0;i<size;++i){
                x=queue2.poll();
                queue1.offer(x);
            }
           return x;
        }else{
            int size=queue1.size();
            int x=-1;
            for(int i=0;i<size;++i){
                x=queue1.poll();
                queue2.offer(x);
            }
            return x;
        }
    }
    //判斷棧是否為空
    public boolean empty() {
        if(queue1.isEmpty()&&queue2.isEmpty()){
            return true;
        }
        return false;
    }
}

3、棧實現(xiàn)隊列

【OJ鏈接】

還是和上面一樣,需要用到兩個棧(stack1、stack2)。和實現(xiàn)棧列不同的是,入隊只能對同一個棧進行操作。如果兩個棧都為空,則隊列為空。

  • 入隊(push):規(guī)定stack1用來入隊。每次入隊時,對stack1進行入棧操作即可。
  • 出隊(pop):規(guī)定stack2進行出隊操作。如果隊列為空時,不能進行出隊操作。當stack2為空時,我們需要將stack1中所有元素出棧,放入stack2中,然后對stack2進行出棧操作。如果stack2不為空,則直接對stack2進行出棧操作即可。
  • 獲取隊列開頭元素(peek):和出棧操作相同,最后只需要獲取stack2的棧頂元素即可。

【代碼如下】

class MyQueue {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
    //構(gòu)造方法
    public MyQueue() {
        stack1=new Stack<>();
        stack2=new Stack<>();
    }
    //入隊操作
    public void push(int x) {
        stack1.push(x);
    }
    //出隊操作
    public int pop() {
        if(stack2.empty()){
            int size=stack1.size();
            for(int i=0;i<size;++i){
                int x=stack1.pop();
                stack2.push(x);
            }
        }
        return stack2.pop();
 
    }
    //獲取隊列開頭的元素
    public int peek() {
        if(stack2.empty()){
            int size=stack1.size();
            for(int i=0;i<size;++i){
                int x=stack1.pop();
                stack2.push(x);
            }
        }
        return stack2.peek();
    }
    //判斷隊列是否為空
    public boolean empty() {
        if(stack1.empty()&&stack2.empty()){
            return true;
        }
        return false;
    }
}

4、實現(xiàn)最小棧

【OJ鏈接】

其實就是要在O(1)的時間復雜度內(nèi)找到棧的最小元素。需要兩個棧來實現(xiàn),一個棧來進行出棧、入棧操作。只需要保證不管如何操作,另一個棧的棧頂元素都是當前棧的最小元素即可。

兩個棧stack1、stack2,站的操作都在stack1中:

  • 入棧:如果第一次入棧,我們需要將其也放入stack2中,之后的入棧,將入棧元素與stack2的棧頂元素進行比較,如果其小于stack2的棧頂元素,則將其放入stack2中。
  • 出棧:對stack1出棧時,將其與stack2的棧頂元素進行比較,如果其等于stack2的棧頂元素,則對stack2進行出棧操作。

這樣就能保證stack2的棧頂元素總是stack1的最小元素。注意:如果stack1中入棧兩個相同的最小元素,都需要對stack2進行入棧。

【代碼如下】

class MinStack {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
    //構(gòu)造方法
    public MinStack() {
        stack1=new Stack<>();
        stack2=new Stack<>();
    }
    //入棧
    public void push(int val) {
        stack1.push(val);
        if(stack2.empty()){
            stack2.push(val);
        }else{
            if(val<=stack2.peek()){
                stack2.push(val);
            }
        }
    }
    //出棧
    public void pop() {
        int x=stack1.pop();
        if(x==stack2.peek()){
            stack2.pop();
        }
    }
    //獲取棧頂元素
    public int top() {
        return stack1.peek();
    }
    //獲取棧的最小元素
    public int getMin() {
        return stack2.peek();
    }
}

到此這篇關于Java 棧與隊列實戰(zhàn)真題訓練的文章就介紹到這了,更多相關Java 棧與隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java使用任務架構(gòu)執(zhí)行任務調(diào)度示例

    java使用任務架構(gòu)執(zhí)行任務調(diào)度示例

    在Java 5.0之前啟動一個任務是通過調(diào)用Thread類的start()方法來實現(xiàn)的,5.0里提供了一個新的任務執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務的執(zhí)行,并且可以建立一個類似數(shù)據(jù)庫連接池的線程池來執(zhí)行任務,下面看一個示例
    2014-01-01
  • idea已經(jīng)提交到遠程分支,但需要本地和遠程都回退到某一版本問題

    idea已經(jīng)提交到遠程分支,但需要本地和遠程都回退到某一版本問題

    這篇文章主要介紹了idea已經(jīng)提交到遠程分支,但需要本地和遠程都回退到某一版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java中的自動拆裝箱、基本類型的轉(zhuǎn)換、包裝類的緩存詳解

    Java中的自動拆裝箱、基本類型的轉(zhuǎn)換、包裝類的緩存詳解

    文章詳細介紹了Java中數(shù)據(jù)類型的拆裝箱、自動拆箱和裝箱,以及包裝類的緩存機制,包括基本數(shù)據(jù)類型的容量大小、轉(zhuǎn)換規(guī)則和自動類型轉(zhuǎn)換等
    2024-12-12
  • 如何解決springboot自動重啟問題

    如何解決springboot自動重啟問題

    這篇文章主要介紹了如何解決springboot自動重啟問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • idea快速生成代碼配置的方法示例

    idea快速生成代碼配置的方法示例

    本文主要介紹了idea快速生成代碼配置的方法示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • java在運行時能修改工作目錄嗎

    java在運行時能修改工作目錄嗎

    這篇文章主要給大家介紹了關于java在運行時能修改工作目錄的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Idea里github的圖形化操作配置方法

    Idea里github的圖形化操作配置方法

    這篇文章主要介紹了Idea里github的圖形化操作配置方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 高效數(shù)據(jù)傳輸?shù)拿孛芪淦鱌rotobuf的使用教程

    高效數(shù)據(jù)傳輸?shù)拿孛芪淦鱌rotobuf的使用教程

    Protobuf(Protocol?Buffers)是由?Google?開發(fā)的一種輕量級、高效的數(shù)據(jù)交換格式,它被用于結(jié)構(gòu)化數(shù)據(jù)的序列化、反序列化和傳輸,本文主要介紹了它的具體使用方法,需要的可以參考一下
    2023-05-05
  • spring中時間格式化的兩種方法示例講解

    spring中時間格式化的兩種方法示例講解

    這篇文章主要介紹了spring中時間格式化的兩種方法,方法一自己格式化,方法二通過配置,結(jié)合實例代碼講解的非常詳細,文中補充介紹了Spring項目中時間格式化的方法,需要的朋友可以參考下
    2023-08-08
  • Java用split分割含一個或多個空格的字符串案例

    Java用split分割含一個或多個空格的字符串案例

    這篇文章主要介紹了Java用split分割含一個或多個空格的字符串案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來過來看看吧
    2020-09-09

最新評論

静海县| 宝丰县| 蓬溪县| 墨脱县| 新密市| 三都| 北碚区| 博野县| 舒城县| 钦州市| 奇台县| 安图县| 彩票| 昭平县| 江口县| 大冶市| 集贤县| 五家渠市| 商水县| 永康市| 昌吉市| 乾安县| 封开县| 历史| 淮南市| 彭山县| 五原县| 肇东市| 德江县| 华坪县| 大埔区| 抚松县| 介休市| 呼图壁县| 五寨县| 中宁县| 平泉县| 阿克陶县| 娱乐| 吐鲁番市| 金川县|