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

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

  • 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,后面跳转到0front = (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.mzph.cn/news/641832.shtml

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

相关文章

JAVA的面试题四

1.电商行业特点 &#xff08;1&#xff09;分布式&#xff1a; ①垂直拆分:根据功能模块进行拆分 ②水平拆分:根据业务层级进行拆分 &#xff08;2&#xff09;高并发&#xff1a; 用户单位时间内访问服务器数量,是电商行业中面临的主要问题 &#xff08;3&#xff09;集群&…

python数据分析——numpy基本用法

numpy数据类型 在NumPy中&#xff0c;有多种数据类型可用于表示数组的元素。以下是一些常见的NumPy数据类型&#xff1a; int - 整数类型&#xff0c;如int8、int16、int32、int64等。uint -无符号整数类型&#xff0c;如uint8、uint16、uint32、uint64等。float -浮点数类型…

PaddleNLP 如何打包成Windows环境可执行的exe?

当我们使用paddleNLP完成业务开发后&#xff0c;需要将PaddleNLP打包成在Windows操作系统上可执行的exe程序。操作流程&#xff1a; 1.环境准备&#xff1a; python环境&#xff1a;3.7.4 2.安装Pyinstaller pip install pyinstaller 3.目录结构&#xff0c;main.py为可执…

测试开发基础 | 计算机网络篇(二):物理层与数据链路层

【摘要】 计算机网络知识是自动化测试等技术基础&#xff0c;也是测试面试必考题目。霍格沃兹测试学院特别策划了本系列文章&#xff0c;将带大家一步步夯实计算机网络的基础知识。由于物理层知识在互联网软件研发工作中用到的并不多&#xff0c;所以可以仅做一个简单的了解。物…

jQuery语法知识(DOM操作)

一、class 属性: .addClass&#xff08;&#xff09;、.hasClass&#xff08;&#xff09;.removeClass&#xff08;&#xff09;、.toggleClass&#xff08;&#xff09; 二、DOM 插入并包裹现有内容 1、.wrap( wrappingElement): 在每个配的元素外层包上一个html元素。 …

Buildroot显示kernel logo

buildroot开机时DSI屏幕变成跟uart一样输出log&#xff0c;现在想显示logo 1、failed to show loader logo [ 2.467479] mmcblk1: p1 p2 p3 p4 p5 p6 p7 p8 p9 [ 2.468827] rockchip-drm display-subsystem: cant not find any loader display [ 2.468859] rockc…

Windows Service 2008 r2的安装

创建虚拟机–&#xff08;操作非常简单&#xff0c;跟着图片的数据下一步即可&#xff09; 选择自己要安装的虚拟机版本 在这里可以更改虚拟机存放的位置 这里的40个G并不会马上占用&#xff0c;当虚拟机里的东西到40个G的大小就不会再存储东西了 选择和自己虚拟…

春运倒计时,AR 引领铁路运输安全新风向

根据中国交通新闻网发布最新消息&#xff0c;今年春运全国跨区域人员流动量预计达 90 亿人次。 随着春运期间旅客数量不断创下新高&#xff0c;铁路运输面临着空前的挑战与压力。 图源&#xff1a;pixabay 聚焦铁路运输效率与旅客安全保障问题&#xff0c;本期行业趋势将探讨 …

51-16 FusionAD 用于自动驾驶预测与规划任务的多模态融合论文精读

今天要分享的是基于BEV的多模态、多任务、端到端自动驾驶模型FusionAD&#xff0c;其专注于自动驾驶预测和规划任务。这项工作首次发表于2023年8月2日&#xff0c;性能超越了2023 CVPR最佳论文UniAD模型。论文题目是FusionAD: Multi-modality Fusion for Prediction and Planni…

记录一些随机约束的控制方法

文章目录 前言一、内嵌约束控制二、控制rand变量是否随机三、选择随机控制的变量四、控制约束块是否随机五、约束的嵌套控制总结 前言 在运用UVM验证过程中&#xff0c;经常会用到大量的随机&#xff0c;这个时候我们需要控制随机约束的打开或者关闭&#xff0c;来实现不同模式…

linux显示系统内存使用情况--free命令

free 命令是Linux系统中用于显示系统内存使用情况的一个常用工具。通过该命令&#xff0c;用户可以轻松了解系统的内存分配、使用情况以及性能状况。本文将深入介绍free命令的各个方面&#xff0c;并提供详细的示例。 安装与基本用法 通常来说&#xff0c;free命令已经预装在大…

基于Python实现人脸识别相似度对比

目录 引言背景介绍目的和意义 人脸识别的原理人脸图像获取人脸检测与定位人脸特征提取相似度计算 基于Python的人脸相似度对比实现数据集准备人脸图像预处理特征提取相似度计算 引言 背景介绍 人脸识别技术是一种通过计算机对人脸图像进行分析和处理&#xff0c;从而实现自动识…

2023.1.17 关于 Redis 持久化 AOF 策略详解

目录 引言 AOF 策略 实例演示一 缓冲区 重写机制 手动触发 自动触发 AOF 重写流程 实例演示二 引言 Redis 实现持久化的两大策略 RDB ——> Redis DataBase&#xff08;定期备份&#xff09;AOF ——> Append Only File&#xff08;实时备份&#xff09; 注意&…

JavaEE:多线程(2):线程状态,线程安全

目录 线程状态 线程安全 线程不安全 加锁 互斥性 可重入 死锁 死锁的解决方法 Java标准库中线程安全类 内存可见性引起的线程安全问题 等待和通知机制 线程饿死 wait notify 线程状态 就绪&#xff1a;线程随时可以去CPU上执行&#xff0c;也包含在CPU上执行的…

漏洞补丁修复之openssl版本从1.1.1q升级到1.1.1t以及python版本默认2.7.5升级到2.7.18新版本和Nginx版本升级到1.24.0

​ 一、Openssl升级 1、查看Openssl安装的版本 openssl version 2、查看Openssl路径 which openssl 3、上传openssl安装包到服务器:openssl-1.1.1t.tar.gz,并且解压,安装: mv /usr/local/openssl /usr/local/backup_openssl_1.1.1q_20240120 mkdir /usr/local/openssl tar…

强化学习:MuJoCo机器人强化学习仿真入门

声明&#xff1a;我们跳过mujoco环境的搭建&#xff0c;搭建环境不难&#xff0c;可自行百度 下面开始进入正题&#xff08;需要有一定的python基础与xml基础&#xff09;&#xff1a; 下面进入到建立机器人模型的部分&#xff1a; 需要先介绍URDF模型文件和导出MJCF格式 介绍完…

K8S--安装Nginx

原文网址&#xff1a;K8S--安装Nginx-CSDN博客 简介 本文介绍K8S安装Nginx的方法。 1.创建Nginx目录及配置文件 mkdir -p /work/devops/k8s/app/nginx/{config,html} 在config目录下创建nginx.conf配置文件&#xff0c;内容如下&#xff1a; # events必须要有 events {wo…

PALWORLD linux centos7开服教程

开放端口8211 iptables -A INPUT -p udp -p tcp --dport 8211 -j ACCEPT iptables -A INPUT -p udp -p udp --dport 8211 -j ACCEPT yum -y install glibc.i686 libstdc.i686 screen libcurl.i686 yum install glibc-devel.i686 yum install libstdc-devel.i686 yum -y ins…

逆序对数量(归并排序做法)

先给出上一篇文章归并排序模板-CSDN博客里的归并排序模板&#xff1a; #include<iostream> using namespace std;const int N 100010;int n; int q[N], temp[N];void merge_sort(int q[], int l, int r) {if(l > r) return;int mid (lr) >> 1;merge_sort(q, …

爬虫安居客新房

一、首先看网址 后面有全部代码 https://hf.fang.anjuke.com/loupan/baohequ/p3 这种形式很好分析&#xff0c;https://hf.fang.anjuke.com/loupan/行政区域页码 xinfang_area ["feixixian", "baohequ", "shushanqu", "luyangqu",…