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

news2024/11/28 6:17:42

队列、循环队列、用队列模拟栈、用栈模拟队列

  • 1.队列
    • 1.1 什么是队列
    • 1.2 创建队列
    • 1.3 队列是否为空和获取队头元素 empty()+peek()
    • 1.4 入队offer()
    • 1.5 出队(头删)poll()
  • 2. 循环队列
    • 2.1 创建循环队列
    • 2.2 判断是否为空isEmpty()和满isFull()
    • 2.3 入队enQueue()
    • 2.4 出队 deQueue()
    • 2.5 得到队头元素不删除 Front()
    • 2.6 得到队尾元素不删除 Rear()
  • 3.用队列模拟栈
    • 3.1 实例化两个队列
    • 3.2 判断栈是否为空
    • 3.1 入栈push()
    • 3.2 出栈pop()
    • 3.3 获取栈顶元素top()
  • 4.用栈模拟队列
    • 4.1 实例化两个栈
    • 4.2 入队push()
    • 4.3 出队pop()
    • 4.4 获取队顶元素peek()+队列是否为空empty()

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. 循环队列

在这里插入图片描述
假如队列的大小为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第二个栈的栈顶元素即可

        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();
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1404740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Linux中的动态库与静态库

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;I Wish My Mind Would Shut Up—Ivoris 0:21━━━━━━️&#x1f49f;──────── 2:04 &#x1f504; ◀️ …

基于SpringBoot的手机商城

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

苏州渭塘镇应用无人机“智慧执法”

苏州渭塘镇应用无人机“智慧执法” 在今年以来&#xff0c;渭塘镇综合行政执法局采用了“空中地面”的立体监督模式&#xff0c;以实现对“互联网执法”工作的深入推进。在这一模式下&#xff0c;无人机巡查作为技术手段得到广泛应用&#xff0c;而安全生产监管信息系统和综合…

MySQL-函数-数值函数

常见的数值函数 案例

【一文秒懂】Ftrace系统调试工具使用终极指南

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强公司&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

Armv8-M的TrustZone技术之内存属性单元

如果处理器包含Armv8-M安全扩展&#xff0c;则内存区域的安全状态由内部安全属性单元&#xff08;SAU&#xff0c;Secure Attribution Unit&#xff09;或外部实现定义的属性单元&#xff08;IDAU&#xff0c;Implementation Defined Attribution Unit&#xff09;的组合控制。…

【WinForm.NET开发】ToolStrip 控件体系结构

本文内容 ToolStripToolStripItem附件类 ToolStrip 和 ToolStripItem 类提供了一种灵活的可扩展系统&#xff0c;用于显示工具栏、状态和菜单项。 这些类都包含在 System.Windows.Forms 命名空间中 &#xff0c;它们的名称通常都带有“ToolStrip”前缀&#xff08;如 ToolStr…

yolov8 opencv dnn部署自己的模型

源码地址 本人使用的opencv c github代码,代码作者非本人 使用github源码结合自己导出的onnx模型推理自己的视频 推理条件 windows 10 Visual Studio 2019 Nvidia GeForce GTX 1070 opencv4.7.0 (opencv4.5.5在别的地方看到不支持yolov8的推理&#xff0c;所以只使用opencv…

HDMI、VGA、DVI、DB接口的区别

HDMI、VGA、DVI和DB&#xff08;也称为DisplayPort&#xff09;是不同类型的视频接口标准&#xff0c;它们用于连接计算机、显示器、电视和其他视频设备。 HDMI&#xff08;High-Definition Multimedia Interface&#xff0c;高清晰度多媒体接口&#xff09;&#xff1a;HDMI支…

C语言——静态通讯录的实现

今天我们来实现一下一个静态的通讯录&#xff1a; 我就先展示一下几个功能&#xff1a; 实现一个通讯录&#xff1b; 通讯录可以用来存储100个人的信息&#xff0c;每个人的信息包括&#xff1a;姓名、性别、年龄、电话、住址 提供方法&#xff1a; 添加联系人信息删除指定…

rancher和k8s接口地址,Kubernetes监控体系,cAdvisor和kube-state-metrics 与 metrics-server

为了能够提前发现kubernetes集群的问题以及方便快捷的查询容器的各类参数&#xff0c;比如&#xff0c;某个pod的内存使用异常高企 等等这样的异常状态&#xff08;虽然kubernetes有自动重启或者驱逐等等保护措施&#xff0c;但万一没有配置或者失效了呢&#xff09;&#xff0…

容器技术2-镜像与容器储存

目录 一、镜像制作 1、ddocker build 2、docker commit 二、镜像存储 1、公共仓库 2、私有仓库 三、镜像使用 四、容器存储 1、镜像元数据 2、存储驱动 3、数据卷 一、镜像制作 1、ddocker build 基于 Dockerfile 自动构建镜像 其机制为&#xff1a;每一行都会基于…

Go 的 Http 请求系统指南

文章目录 快速体验请求方法URL参数响应信息BodyStatusCodeHeaderEncoding 图片下载定制请求头复杂的POST请求表单提交提交文件 CookieClient 上设置 Cookie请求上设置 Cookie 重定向和请求历史超时设置总超时连接超时读取超时 请求代理错误处理总结 前几天在 “知乎想法” 谈到…

linux安装docker(入门一)

环境&#xff1a;centos 7(linux) 网站 官网: https://docs.docker.com/ Docker Hub 网站: https://hub.docker.com/ 容器官方概述 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &…

Python小细节之代码极致简化到一行(5)(列表推导式)(技法慎用)

列表、推导式 引言简化前简化后讲解简化前简化后 应用结尾 引言 简单快速 大行其道 现在我又带着简化代码来了 我思考了下 简化的代码是技巧的体现 但是简短的代码里面 蕴藏着的是Python的精华 所以 我会更加详细的解析代码的内容 致力于让每个零基础的人都看懂 简化前 m…

DP活动:HMI-Board以太网数据监视器(一)以太网外设的使用

HMI-Board以太网数据监视器 开发工具  RT-Thread Studio/Keil MDK5&#xff08;固件开发、编译&#xff09;  SquareLine Studio&#xff08;LVGL UI设计工具&#xff09; 资料链接  RT-Thread Studio下载链接&#xff1a; https://download_redirect.rt-thread.org/…

C# 控制台进度条

最简单 namespace ProcessStu01 {internal class Program{static void Main(string[] args){for (int i 1; i < 100; i){Console.Write("\r{0,3}%",i);Thread.Sleep(50);}}} }第三方库 https://github.com/Mpdreamz/shellprogressbar using ShellProgressBar…

ubuntu source: not found

1、原因分析&#xff1a; shell 的解释器不是 bash&#xff0c;需把 shell 的解释器更改为 bash 2、ls -l /bin/sh 3、sudo dpkg-reconfigure dash 选择No 4、ls -l /bin/sh 5、reboot&#xff08;此步必须持续&#xff0c;否则无效&#xff09;

JUC并发编程-集合不安全情况以及Callable线程创建方式

6. 集合不安全 1&#xff09;List 不安全 //java.util.ConcurrentModificationException 并发修改异常&#xff01; public class ListTest {public static void main(String[] args) {List<Object> arrayList new ArrayList<>();for(int i1;i<30;i){new Thr…

020-信息打点-红蓝队自动化项目资产侦察企查产权武器库部署网络空间

020-信息打点-红蓝队自动化项目&资产侦察&企查产权&武器库部署&网络空间 #知识点&#xff1a; 1、工具项目-红蓝队&自动化部署 2、工具项目-自动化侦查收集提取 3、工具项目-综合&网络空间&信息 演示案例&#xff1a; ➢自动化-武器库部署-F8x ➢自…