国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java數(shù)據(jù)結構 -- 隊列:隊列有關面試oj算法題】

這篇具有很好參考價值的文章主要介紹了【Java數(shù)據(jù)結構 -- 隊列:隊列有關面試oj算法題】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.隊列

1.1 什么是隊列

只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作得特殊線性表,隊列是先進先出,入隊:進行插入操作得一端稱為隊尾(rear),出隊:進行刪除操作的一端稱為隊頭(front)。隊列Queue是個接口,底層通過鏈表實現(xiàn)的。

  • boolean offer(E e) – 入隊列
  • E poll() – 出隊列
  • peek() – 獲取隊頭元素
  • int size() – 獲取隊列中有效元素個數(shù)
  • boolean isEmpty() – 檢測隊列是否為空

注意:Queue是個接口,在實例化時必須實例化LinkedList的對象,因為LinkedList實現(xiàn)了Queue接口。

1.2 創(chuàng)建隊列

public class MyQueue {
    static class ListNode {
        public int val;
        public ListNode prev;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;  // 隊頭
    public ListNode last;  // 隊尾
}

1.3 隊列是否為空和獲取隊頭元素 empty()+peek()

    public boolean empty() {
        return head == null;
    }

    public int peek() {
        if (head == null) {
            return -1;
        }
        return head.val;
    }

1.4 入隊offer()

入隊相當于鏈表的尾插法,入隊元素node,然后隊列為空,直接把頭尾節(jié)點指向node,不為空:從隊尾入隊操作,last的后節(jié)點指向node,node的前節(jié)點指向last,last再指向node。

    public void offer(int val) {
        ListNode node = new ListNode(val);
        if (head == null) {
            head = last = node;
        }else {
            last.next = node;
            node.prev = last;
            last = node;
        }
    }

1.5 出隊(頭刪)poll()

給個臨時變量val,當只有一個節(jié)點時:val指向head.val,出隊完head指向null,返回val。不止一個節(jié)點:val指向head.val,head指向head的后節(jié)點,head的前驅節(jié)點指向null,返回val。

    public int poll() {
        if(head == null) {
            return -1;
        }
        //只有一個節(jié)點
        int val = -1;
        if (head.next == null) {
            val = head.val;
            head = null;
            return val;
        }
        val = head.val;
        head = head.next;
        head.prev = null;
        return val;
    }

2. 循環(huán)隊列

【Java數(shù)據(jù)結構 -- 隊列:隊列有關面試oj算法題】,Java數(shù)據(jù)結構,java,數(shù)據(jù)結構,面試
假如隊列的大小為8,當7走到下一個下標0的時候,下標+1實現(xiàn)不了,所有在循環(huán)隊列當中,實現(xiàn)數(shù)組下標循環(huán):隊頭:front = (front + 1) % elem.length,隊尾:rear = (rear + 1) % elem.length,區(qū)分隊列空和滿當隊頭front和隊尾rear相遇時為空。當隊尾rear的下個為隊頭front為滿。

2.1 創(chuàng)建循環(huán)隊列

class MyCircularQueue {
    // 循環(huán)隊列
    public int[] elem;
    public int front;
    public int rear;
    public MyCircularQueue(int k) {
        elem = new int[k+1];
    }
}

2.2 判斷是否為空isEmpty()和滿isFull()

    public boolean isEmpty() {
        return front == rear;
    }

    public boolean isFull() {
        return (rear+1) % elem.length == front;
    }

2.3 入隊enQueue()

    public boolean enQueue(int value) {
        if (isFull()) {
            return false;
        }else {
            elem[rear] = value;
            rear = (rear + 1) % elem.length;
            return true;
        }
    }

2.4 出隊 deQueue()

    public boolean deQueue() {
        if(isEmpty()) {
            return false;
        }else {
            // 得到數(shù)組下標最后再完后的下標  如果最大是8,后面跳轉到0
            front = (front + 1) % elem.length;
            return true;
        }
    }

2.5 得到隊頭元素不刪除 Front()

    public int Front() {
        if (isEmpty()) {
            return -1;
        }
        return elem[front];
    }

2.6 得到隊尾元素不刪除 Rear()

    public int Rear() {
        if (isEmpty()) {
            return -1;
        }
        int index = (rear == 0) ? elem.length-1 : rear-1;
        return elem[index];
    }

3.用隊列模擬棧

在這里用到兩個先進先出的隊列來實現(xiàn)棧。
思路:

  • 1.當兩個隊列都是空的時候,放到第一個隊列
  • 2.再次入棧的時候,放到不為空的隊列
  • 3.出棧的時候,出不為空的隊列 出size-1個元素,剩下的元素就是要出棧的元素

3.1 實例化兩個隊列

class MyStack{
	private Queue<Integer> qu1;
    private Queue<Integer> qu2;

    public MyStack() {
        qu1 = new LinkedList<>();
        qu2 = new LinkedList<>();
    }
}

3.2 判斷棧是否為空

判斷棧是否為空我們直接返回兩個隊列是否為空。

    public boolean empty() {
        return qu1.isEmpty() && qu2.isEmpty();
    }

3.1 入棧push()

當兩個隊列都是空的時候,放到第一個隊列,再次入棧的時候,放到不為空的隊列

    public void push(int x) {
        if (empty()) {
            qu1.offer(x);
            return;
        }
        if (!qu1.isEmpty()) {
            qu1.offer(x);
        }else {
            qu2.offer(x);
        }
    }

3.2 出棧pop()

找到不為空的隊列 出size-1個元素 剩下的元素就是出棧的元素,每彈出一個size都在變小一次,

    public int pop() {
        if (empty()) {
            return -1;
        }
        // 找到不為空的隊列 出size-1個元素 剩下的元素就是出棧的元素
        if (!qu1.isEmpty()) {
            int size = qu1.size();
            for (int i = 0; i < size-1; i++) {
                qu2.offer(qu1.poll());
            }
            return qu1.poll();
        }else {
            // 沒彈出一個size都在變小一次
            int size = qu2.size();
            for (int i = 0; i < size-1; i++) {
                qu1.offer(qu2.poll());
            }
            return qu2.poll();
        }
    }

3.3 獲取棧頂元素top()

和出棧一樣,給一個臨時變量tmp,用tmp接收隊列的最后一個元素。

    public int top() {

        if (empty()) {
            return -1;
        }
        if (!qu1.isEmpty()) {
            int size = qu1.size();
            int tmp = -1;
            for (int i = 0; i < size; i++) {
                tmp = qu1.poll();
                qu2.offer(tmp);
            }
            return tmp;
        }else {
            // 沒彈出一個size都在變小一次
            int size = qu2.size();
            int tmp = -1;
            for (int i = 0; i < size; i++) {
                tmp = qu2.poll();
                qu1.offer(tmp);
            }
            return tmp;
        }
    }

4.用棧模擬隊列

用棧模擬實現(xiàn)隊列也需要用到兩個棧,思路:

  • 1.入隊:把數(shù)據(jù)放到第一個棧中
  • 2.出隊:把第一個棧的全部元素放進第二棧當中,出st2這個棧當中的棧頂元素即可,如果st2為空,把st1里面所有的元素全部放到st2
  • 3.當兩個棧為空 說明模擬的棧隊列為空

4.1 實例化兩個棧

class MyQueue {
        private Stack<Integer> st1;
        private Stack<Integer> st2;
        public MyQueue() {
            st1 = new Stack<>();
            st2 = new Stack<>();
        }
}

4.2 入隊push()

入棧直接全部放進第一個棧中

        public void push(int x) {
            st1.push(x);
        }

4.3 出隊pop()

把第一個棧的全部元素放進第二棧當中,出st2這個棧當中的棧頂元素即可,如果st2為空,把st1里面所有的元素全部放到st2

        public int pop() {
            if(empty()) {
                return -1;
            }
            if(st2.empty()) {
                while(!st1.empty()) {
                    st2.push(st1.pop());
                }
            }
            return st2.pop();
        }

4.4 獲取隊頂元素peek()+隊列是否為空empty()

和出隊一樣,peek第二個棧的棧頂元素即可文章來源地址http://www.zghlxwxcb.cn/news/detail-824106.html

        public int peek() {
            if(empty()) {
                return -1;
            }
            if(st2.empty()) {
                while(!st1.empty()) {
                    st2.push(st1.pop());
                }
            }
            return st2.peek();
        }

        public boolean empty() {
            return st1.empty() && st2.empty();
        }

到了這里,關于【Java數(shù)據(jù)結構 -- 隊列:隊列有關面試oj算法題】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【數(shù)據(jù)結構】棧與隊列經(jīng)典oj題

    【數(shù)據(jù)結構】棧與隊列經(jīng)典oj題

    ??write in front?? ??所屬專欄:初階數(shù)據(jù)結構 ???博客主頁:睿睿的博客主頁 ???代碼倉庫:??VS2022_C語言倉庫 ??您的點贊、關注、收藏、評論,是對我最大的激勵和支持?。?! 關注我,關注我,關注我 , 你們將會看到更多的優(yōu)質內(nèi)容??! ??棧兩種線性表示都能實現(xiàn)

    2024年02月03日
    瀏覽(17)
  • 【數(shù)據(jù)結構】——棧與隊列(附加oj題詳解)深度理解

    【數(shù)據(jù)結構】——棧與隊列(附加oj題詳解)深度理解

    1.棧的定義 棧: 棧是僅限與在表尾進行插入或者刪除的 線性表 我們把 允許一端插入和刪除的一端叫做棧頂,另一端叫棧底,不含任何元素的棧叫做空棧 ,棧又叫做后進先出的線性表,簡稱 LIFO 結構 2.棧的理解 對于定義里面的在表尾進行插入和刪除, 這里的表尾就是棧頂,

    2024年03月26日
    瀏覽(21)
  • 數(shù)據(jù)結構刷題訓練:設計循環(huán)隊列(力扣OJ)

    數(shù)據(jù)結構刷題訓練:設計循環(huán)隊列(力扣OJ)

    目錄 文章目錄 前言 1. 題目:設計循環(huán)隊列 2. 思路 3. 分析 ?3.1 定義循環(huán)隊列 ?3.2 創(chuàng)建隊列 ?3.3 判空和判滿 ?3.4 入隊 ?3.5 出隊 ?3.6 取隊頭隊尾數(shù)據(jù) ?3.7 銷毀隊列 ?4. 題解 總結 ????????當談到隊列數(shù)據(jù)結構時,很多人可能會想到普通的隊列,即先進先出(FIFO)的數(shù)據(jù)結

    2024年02月13日
    瀏覽(22)
  • 【LeetCode】【數(shù)據(jù)結構】棧與隊列必刷OJ題

    【LeetCode】【數(shù)據(jù)結構】棧與隊列必刷OJ題

    ?? 樊梓慕: 個人主頁 ? ?? 個人專欄: 《C語言》《數(shù)據(jù)結構》《藍橋杯試題》《LeetCode刷題筆記》 ?? 每一個不曾起舞的日子,都是對生命的辜負 目錄 前言: 【LeetCode】20.有效的括號(棧的括號匹配問題) 【LeetCode】225.用隊列實現(xiàn)棧 【LeetCode】232.用棧實現(xiàn)隊列 【LeetCo

    2024年02月13日
    瀏覽(23)
  • 數(shù)據(jù)結構刷題訓練:用棧實現(xiàn)隊列(力扣OJ)

    數(shù)據(jù)結構刷題訓練:用棧實現(xiàn)隊列(力扣OJ)

    目錄 前言 1. 題目:用棧實現(xiàn)隊列 2. 思路 3. 分析 ?3.1 定義 “ 隊列 ” ?3.2 創(chuàng)建隊列 3.3 入隊 ?3.4 隊頭數(shù)據(jù) ?3.5 出隊 ?3.6 判空和銷毀 4.題解 總結 ????????棧和隊列是數(shù)據(jù)結構中的兩個重要概念,它們在算法和程序設計中都有著廣泛的應用。本文將帶你深入了解如何使用

    2024年02月13日
    瀏覽(23)
  • 萬字精講——數(shù)據(jù)結構棧與隊列必會OJ練習

    萬字精講——數(shù)據(jù)結構棧與隊列必會OJ練習

    W...Y的主頁??? 代碼庫分享??? 在之前的博客中,我們學習了棧與隊列的基本內(nèi)容,并且實現(xiàn)了棧與隊列。今天我們進行刷題訓練,走進棧與隊列的世界中去感受一番?。。?目錄 括號匹配問題 ?使用隊列實現(xiàn)棧 用棧實現(xiàn)隊列 設計循環(huán)隊列 給定一個只包括? \\\'(\\\' , \\\')\\\' , \\\'{

    2024年02月10日
    瀏覽(21)
  • 【數(shù)據(jù)結構】面試OJ題——時間復雜度

    【數(shù)據(jù)結構】面試OJ題——時間復雜度

    ? 目錄 一:旋轉數(shù)組 思路: ?二:消失的數(shù)字 思路: 189. 輪轉數(shù)組 - 力扣(LeetCode) 給定一個整數(shù)數(shù)組? nums ,將數(shù)組中的元素向右輪轉? k ? 個位置,其中? k ? 是非負數(shù)。 ?這道題和【C語言】系列里面有道題很像-《 旋轉字符 》 我們先回顧一下《 旋轉字符》 的思路 采

    2024年02月08日
    瀏覽(13)
  • 【數(shù)據(jù)結構】面試OJ題——時間復雜度2

    【數(shù)據(jù)結構】面試OJ題——時間復雜度2

    目錄 一:移除元素 思路:? ?二:刪除有序數(shù)組中的重復項 思路: 三:合并兩個有序數(shù)組 思路1: 什么?你不知道qsort() ?思路2: 27. 移除元素 - 力扣(LeetCode) 給你一個數(shù)組? nums ? 和一個值? val ,你需要? 原地 ?移除所有數(shù)值等于? val ? 的元素,并返回移除后數(shù)組的

    2024年02月07日
    瀏覽(15)
  • Java面試知識點(全)-數(shù)據(jù)結構和算法

    Java面試知識點(全)-數(shù)據(jù)結構和算法

    Java面試知識點(全)https://nanxiang.blog.csdn.net/article/details/130640392 注:隨時更新 數(shù)組 數(shù)組的下標尋址十分迅速,但計算機的內(nèi)存是有限的,故數(shù)組的長度也是有限的,實際應用當中的數(shù)據(jù)往往十分龐大;而且無序數(shù)組的查找最壞情況需要遍歷整個數(shù)組;后來人們提出了二分查

    2024年02月05日
    瀏覽(32)
  • 【Java程序員面試專欄 數(shù)據(jù)結構】四 高頻面試算法題:哈希表

    【Java程序員面試專欄 數(shù)據(jù)結構】四 高頻面試算法題:哈希表

    一輪的算法訓練完成后,對相關的題目有了一個初步理解了,接下來進行專題訓練,以下這些題目就是匯總的高頻題目,一個O(1)查找的利器哈希表,所以放到一篇Blog中集中練習 題目 解題思路 時間 空間 兩數(shù)之和 輔助哈希 使用map存儲出現(xiàn)過的值,key為值大小,v

    2024年02月22日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包