三分钟“手撕”队列与习题

代码放开头,方便大家查阅

目录

一、实现代码

二、什么是队列

三、队列常见方法

入队push()  

出队 

四、Queue使用

Java自带的Queue 

双端队列 

五、习题

循环队列

用队列实现栈

用栈实现队列


一、实现代码

package demo2;public class MyQueue {class ListNode{ListNode prev;ListNode next;int var;public ListNode(int var) {this.var = var;}}ListNode first;ListNode last;int size=0;public void offer(int val) {ListNode node=new ListNode(val);if(isEmpty()){first=last=node;}else {last.next = node;node.prev = last;last = last.next;}size++;}public int poll() {int var=0;if(first==null){return -1;}else if(first==last){first=last=null;}else {var=first.var;first.next.prev=null;first=first.next;}--size;return var;}public int peek(){if(isEmpty()){return -1;}return first.var;}public boolean isEmpty() {return 0==size;}
}

二、什么是队列

简单来讲:先进先出的队伍!  

假设第一个入队(push)的是1,第二个2 第三个3,那么先进先出的队伍,出来(pop)的是1,然后pop是2,pop是3。

三、队列常见方法

 队列中有两种实现方式:一种是数组,一种是链表,

(Java中的队列也是采用链表实现的)这里我采用链表讲解。 

入队push()  

简单讲:多一个人排队!

入队都是往最后一个节点那里再加一个元素!

出队 

简单来说:排队排到了,买完东西就走了(谁先排到,谁先走) 

把第一次进入的元素蹦出来(删掉) 就行了

四、Queue使用

Java自带的Queue 

 在Java中,Queue是个接口,底层是通过链表实现的。

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

 注意:

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

public static void main(String[] args) {Queue<Integer> q = new LinkedList<>();q.offer(1);q.offer(2);q.offer(3);q.offer(4);q.offer(5); // 从队尾入队列System.out.println(q.size());System.out.println(q.peek()); // 获取队头元素q.poll();System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回if(q.isEmpty()){System.out.println("队列空");}else{System.out.println(q.size());}
}

双端队列 

 双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。

那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

 Deque是一个接口,使用时必须创建LinkedList的对象。 (如下图左下角LinkedList和右边Deque)

所以,我们如果要使用双端队列,应该写出如下代码:

Deque<Integer> queue1 = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue2 = new LinkedList<>();//双端队列的链式实现

五、习题

循环队列

思路如下:

如何循环?当下标为7时,如果再让last往下走last+1就是8就越界了,所以你需要有个方法,就是last=(last+1)%array.length,比如(7+1)%8=0,所以又是来一轮。

注意上图,比如这个last不是指6下标而是指7下标。

class MyCircularQueue {int[] elem;int first;int last;public MyCircularQueue(int k) {elem = new int[k];}public boolean enQueue(int value) {if (isFull()) {return false;}elem[last] = value;last = (last + 1) % elem.length;return true;}public boolean deQueue() {if (isEmpty()) {return false;}first = (first+1)%elem.length;return true;}public int Front() {if (isEmpty()) {return -1;}return elem[first];}public int Rear() {if (isEmpty()) {return -1;}int index=(last==0)?elem.length-1:last-1;return elem[index];}public boolean isEmpty() {return first == last;}public boolean isFull() {return first == (last + 1) % elem.length;}
}

注意的是,即使一模一样是上面的代码,也需要在构造函数的时候k+1,才不会报错。

用队列实现栈

 思路如下:

一个队列肯定是实现不了栈的!为什么?

答:因为一个先进先出,一个先进后出,机制都不一样。所以需要两个队列。

怎么实现呢?

出栈:把一个队列的N-1个元素pop到空一个队列当中!当前队列剩下的一个元素就是我们需要“出栈”的元素!

入栈:把数据放到部位空的队列当中。

注意:第一次入栈时,两个队列都为空,那就放第一个。

import java.util.ArrayDeque;class MyQueue {public ArrayDeque<Integer> s1;public ArrayDeque<Integer> s2;public MyQueue() {s1 = new ArrayDeque<>();s2 = new ArrayDeque<>();}public void push(int x) {s1.push(x);}public int pop() {//2个栈都是空 意味着 队列为空if(empty()) {return -1;}if(s2.isEmpty()) {while (!s1.isEmpty()) {s2.push(s1.pop());}}return s2.pop();}public int peek() {if(empty()) {return -1;}if(s2.isEmpty()) {while (!s1.isEmpty()) {s2.push(s1.pop());}}return s2.peek();}public boolean empty() {return s1.isEmpty() && s2.isEmpty();}
}

用栈实现队列

 思路如下:

入栈:放到第一个栈中

出栈:把第一个栈所有的元素全部放入第二个栈中,第二个栈里面的元素出栈入栈就已经是队列的排法了,如果第二个栈是空的,那么把第一个栈的都拿过来。

import java.util.ArrayDeque;class MyQueue {public ArrayDeque<Integer> s1;public ArrayDeque<Integer> s2;public MyQueue() {s1 = new ArrayDeque<>();s2 = new ArrayDeque<>();}public void push(int x) {s1.push(x);}public int pop() {//2个栈都是空 意味着 队列为空if(empty()) {return -1;}if(s2.isEmpty()) {while (!s1.isEmpty()) {s2.push(s1.pop());}}return s2.pop();}public int peek() {if(empty()) {return -1;}if(s2.isEmpty()) {while (!s1.isEmpty()) {s2.push(s1.pop());}}return s2.peek();}public boolean empty() {return s1.isEmpty() && s2.isEmpty();}

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

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

相关文章

一款小众清新的Typecho主题

源码介绍 DearLicy主题&#xff0c;一款小众化小清新风格的博客主题 主题支持Typecho所支持的所有版本PHP 简约、小众、优雅 源码截图 安装教程 将主题上传至/usr/themes/文件夹下解压后台进行启用访问前台查看效果 源码下载 https://www.qqmu.com/3378.html

一键设置常用纸张和页面边距-Word插件-大珩助手

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】常用纸张和常用边距 1、一键设定符合中国人常用…

273 基于matlab的改进型节点重构小波包频带能量谱与 PNN(概率神经网络)的联合故障诊断新方法

基于matlab的改进型节点重构小波包频带能量谱与 PNN&#xff08;概率神经网络&#xff09;的联合故障诊断新方法。针对风电机组故障信号的非平稳性以及故障与征兆的非线性映射导致的故障识别困难问题&#xff0c;提出了改进型的节点重构小波包频带能量谱与PNN&#xff08;概率神…

大数据数据治理工具

大数据数据治理-CSDN博客 大数据数据治理工具&#xff1a; 开源工具&#xff1a; Apache Atlas&#xff1a; 一个开源的数据治理和元数据框架&#xff0c;为Hadoop生态系统提供数据分类、管理和安全功能。 Apache Ranger&#xff1a; 一个集中式安全管理框架&#xff0c;用于…

Java Web学习笔记2——Web开发介绍

什么是Web&#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;WWW World Wide Web&#xff09;&#xff0c;能够通过浏览器访问的网站。 1&#xff09;淘宝、京东、唯品会等电商系统&#xff1b; 2&#xff09;CRM、OA、ERP企业管理系统&#xff1…

ubuntu-server(22.04)安装

准备工作 首先我们先从网上获取ubuntu的iso镜像文件 Index of /ubuntu-releases/22.04/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 我们安装这个最小包即可 找到我们ubuntu安装完成后所需要下载安装源的网址&#xff08;常用是阿里云&#xff09; ubuntu安装…

手写节流throttle

节流throttle 应用场景 滚动事件监听scroll&#xff1a;例如监听页面滚动到底部加载更多数据时&#xff0c;使用节流技术减少检查滚动位置的频率&#xff0c;提高性能。鼠标移动事件mousemove&#xff1a;例如实现一个拖拽功能&#xff0c;使用节流技术减少鼠标移动事件的处理…

分布式session共享配置

目录 1、spring-session 1.1 添加依赖 1.2 spring-mvc.xml配置文件 1.3 web.xml 2、tomcat配置session、共享 2.1 Tomcat配置 2.2 Web.xml配置 1、spring-session 官方文档&#xff1a;https://docs.spring.io/spring-session/docs/1.3.0.RELEASE/reference/html5/ 1.…

OpenCV中的圆形标靶检测——斑点检测算法(一)

1.导读 在上一节内容中我们简要描述了OpenCV中实现圆形标靶检测的API的使用方法,其处理流程可大致分为1)斑点形状的检测,和2)基于规则的斑点形状的过滤与定位。第一步将类似圆斑形状的区域检测出来,但可能存在一些误检测的噪声,第二步则利用圆斑的分布规则(M*N排列)进行…

攻防世界---misc---can_has_stdio?

1、下载附件是一个没有后缀的文件&#xff0c;尝试将后缀改为txt发现里面有一些特殊字符的编码 2、查阅资料得知它是一种编程代码 3、知道了它是什么代码之后&#xff0c;我们就去解码&#xff08;网址&#xff1a;El Brainfuck (copy.sh)&#xff09; 4、 flag{esolangs_for_f…

ChatTTS,语气韵律媲美真人的开源TTS模型,文字转语音界的新魁首,对标微软Azure-tts

前两天 2noise 团队开源了ChatTTS项目&#xff0c;并且释出了相关的音色模型权重&#xff0c;效果确实非常惊艳&#xff0c;让人一听难忘&#xff0c;即使摆在微软的商业级项目Azure-tts面前&#xff0c;也是毫不逊色的。 ChatTTS是专门为对话场景设计的文本转语音模型&#x…

文件上传题目练习

[HNCTF 2022 Week1]easy_upload 先尝试上传一个php文件&#xff0c;发现直接就成功了 用蚁剑测试连接成功 找到flag [NISACTF 2022]bingdundun~ 白名单上传 这里因为尝试了很多绕过方式都不成功&#xff0c;去搜索了一下wp&#xff0c;发现要用到Phar://伪协议 补充&#xff…

SSRF及相关例题

SSRF及相关例题 服务端请求伪造&#xff08;Server Side Request Forgery, SSRF&#xff09;指的是攻击者在未能取得服务器所有权限时&#xff0c;利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。 SSR…

sql注入 (运用sqlmap解题)

注:level参数 使用–batch参数可指定payload测试复杂等级。共有五个级别&#xff0c;从1-5&#xff0c;默认值为1。等级越高&#xff0c;测试的payload越复杂&#xff0c;当使用默认等级注入不出来时&#xff0c;可以尝试使用–level来提高测试等级。 --level 参数决定了 sql…

鸿蒙应用开发之OpenGL应用和X组件12

在这个应用程序里还有一个功能,就是点击绘画四边形作出响应,也就是触摸X组件进行响应,所以X组件的点击函数响应在前面已经做设置了回调,当用户触摸这个组件时,就会调用函数DispatchTouchEventCB,再从这个函数里调用渲染对象的函数ChangeColor来改变颜色,如下两图是不同的…

<网络安全VIP>第二篇《工业控制软件》

1 PLC PLC,(Programmable Logic Controller),可编程逻辑控制器(PLC)是种专门为在工业环境下应用而设计的数字运算操作电子系统。 2 DCS 四、DCS的发展趋势 一、DCS的基本定义 DCS是分布式控制系统(Distributed Control System)的英文缩写,在国内自控行业又称之为集…

使用wireshark分析tcp握手过程

开启抓包 tcpdump -i any host 127.0.0.1 and port 123 -w tcp_capture.pcap 使用telnet模拟tcp连接 telnet 127.0.0.1 123 如果地址无法连接&#xff0c;则会一直重试SYN包&#xff0c;各个平台SYN重试间隔并不一致&#xff0c;如下&#xff1a; 异常站点抓包展示&#xff…

Fatfs

STM32进阶笔记——FATFS文件系统&#xff08;上&#xff09;_stm32 fatfs-CSDN博客 STM32进阶笔记——FATFS文件系统&#xff08;下&#xff09;_stm32 文件系统怎样获取文件大小-CSDN博客 STM32——FATFS文件基础知识_stm32 fatfs-CSDN博客 021 - STM32学习笔记 - Fatfs文件…

godot.bk4:how to make NPC roam and attack player with global variable‘s usage

1.为什么会有重力的影响&#xff1a;因为CharacterBody2D默认的代码是重力影响的&#xff0c;删掉即可 只需要添加 extends CharacterBody2Dconst SPEED 200.0 var directionfunc _physics_process(delta):direction Input.get_vector("ui_left", "ui_right&…

第一周:计算机网络概述(上)

一、计算机网络基本概念 1、计算机网络通信技术计算机技术 计算机网络就是一种特殊的通信网络&#xff0c;其特殊之处就在于它的信源和信宿就是计算机。 2、什么是计算机网络 在计算机网络中&#xff0c;我们把这些计算机统称为“主机”&#xff08;上图中所有相连的电脑和服…