【Java数据结构 -- 队列:队列有关面试oj算法题】

这篇具有很好参考价值的文章主要介绍了【Java数据结构 -- 队列:队列有关面试oj算法题】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.队列

1.1 什么是队列

只允许在一端进行插入数据操作,在另一端进行删除数据操作得特殊线性表,队列是先进先出,入队:进行插入操作得一端称为队尾(rear),出队:进行删除操作的一端称为队头(front)。队列Queue是个接口,底层通过链表实现的

  • boolean offer(E e) – 入队列
  • E poll() – 出队列
  • peek() – 获取队头元素
  • int size() – 获取队列中有效元素个数
  • boolean isEmpty() – 检测队列是否为空

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

1.2 创建队列

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,然后队列为空,直接把头尾节点指向node,不为空:从队尾入队操作,last的后节点指向node,node的前节点指向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,当只有一个节点时:val指向head.val,出队完head指向null,返回val。不止一个节点:val指向head.val,head指向head的后节点,head的前驱节点指向null,返回val。

    public int poll() {
        if(head == null) {
            return -1;
        }
        //只有一个节点
        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. 循环队列

【Java数据结构 -- 队列:队列有关面试oj算法题】,Java数据结构,java,数据结构,面试
假如队列的大小为8,当7走到下一个下标0的时候,下标+1实现不了,所有在循环队列当中,实现数组下标循环:队头:front = (front + 1) % elem.length,队尾:rear = (rear + 1) % elem.length区分队列空和满当队头front和队尾rear相遇时为空。当队尾rear的下个为队头front为满。

2.1 创建循环队列

class MyCircularQueue {
    // 循环队列
    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 {
            // 得到数组下标最后再完后的下标  如果最大是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.用队列模拟栈

在这里用到两个先进先出的队列来实现栈。
思路:

  • 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.用栈模拟队列

用栈模拟实现队列也需要用到两个栈,思路:

  • 1.入队:把数据放到第一个栈中
  • 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第二个栈的栈顶元素即可文章来源地址https://www.toymoban.com/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数据结构 -- 队列:队列有关面试oj算法题】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】栈与队列经典oj题

    🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!! 关注我,关注我,关注我 , 你们将会看到更多的优质内容!!   栈两种线性表示都能实现

    2024年02月03日
    浏览(42)
  • 【数据结构】——栈与队列(附加oj题详解)深度理解

    1.栈的定义 栈: 栈是仅限与在表尾进行插入或者删除的 线性表 我们把 允许一端插入和删除的一端叫做栈顶,另一端叫栈底,不含任何元素的栈叫做空栈 ,栈又叫做后进先出的线性表,简称 LIFO 结构 2.栈的理解 对于定义里面的在表尾进行插入和删除, 这里的表尾就是栈顶,

    2024年03月26日
    浏览(53)
  • 数据结构刷题训练:设计循环队列(力扣OJ)

    目录 文章目录 前言 1. 题目:设计循环队列 2. 思路 3. 分析  3.1 定义循环队列  3.2 创建队列  3.3 判空和判满  3.4 入队  3.5 出队  3.6 取队头队尾数据  3.7 销毁队列  4. 题解 总结         当谈到队列数据结构时,很多人可能会想到普通的队列,即先进先出(FIFO)的数据结

    2024年02月13日
    浏览(47)
  • 【LeetCode】【数据结构】栈与队列必刷OJ题

    👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言: 【LeetCode】20.有效的括号(栈的括号匹配问题) 【LeetCode】225.用队列实现栈 【LeetCode】232.用栈实现队列 【LeetCo

    2024年02月13日
    浏览(42)
  • 数据结构刷题训练:用栈实现队列(力扣OJ)

    目录 前言 1. 题目:用栈实现队列 2. 思路 3. 分析  3.1 定义 “ 队列 ”  3.2 创建队列 3.3 入队  3.4 队头数据  3.5 出队  3.6 判空和销毁 4.题解 总结         栈和队列是数据结构中的两个重要概念,它们在算法和程序设计中都有着广泛的应用。本文将带你深入了解如何使用

    2024年02月13日
    浏览(39)
  • 万字精讲——数据结构栈与队列必会OJ练习

    W...Y的主页 💕 代码库分享 😊 在之前的博客中,我们学习了栈与队列的基本内容,并且实现了栈与队列。今天我们进行刷题训练,走进栈与队列的世界中去感受一番!!! 目录 括号匹配问题  使用队列实现栈 用栈实现队列 设计循环队列 给定一个只包括  \\\'(\\\' , \\\')\\\' , \\\'{

    2024年02月10日
    浏览(47)
  • 【数据结构】面试OJ题——时间复杂度

      目录 一:旋转数组 思路:  二:消失的数字 思路: 189. 轮转数组 - 力扣(LeetCode) 给定一个整数数组  nums ,将数组中的元素向右轮转  k   个位置,其中  k   是非负数。  这道题和【C语言】系列里面有道题很像-《 旋转字符 》 我们先回顾一下《 旋转字符》 的思路 采

    2024年02月08日
    浏览(38)
  • 【数据结构】面试OJ题——时间复杂度2

    目录 一:移除元素 思路:   二:删除有序数组中的重复项 思路: 三:合并两个有序数组 思路1: 什么?你不知道qsort()  思路2: 27. 移除元素 - 力扣(LeetCode) 给你一个数组  nums   和一个值  val ,你需要  原地  移除所有数值等于  val   的元素,并返回移除后数组的

    2024年02月07日
    浏览(35)
  • Java面试知识点(全)-数据结构和算法

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 数组 数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查

    2024年02月05日
    浏览(62)
  • 【Java程序员面试专栏 数据结构】四 高频面试算法题:哈希表

    一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,一个O(1)查找的利器哈希表,所以放到一篇Blog中集中练习 题目 解题思路 时间 空间 两数之和 辅助哈希 使用map存储出现过的值,key为值大小,v

    2024年02月22日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包