栈和队列(Java实现)

栈和队列(Java实现)

栈(Stack):栈是先进后出(FILO, First In Last Out)的数据结构。Java中实现栈有以下两种方式:

  • stack类
  • LinkedList实现(继承了Deque接口)

(1) Stack实现

由于Stack底层是使用Vector的,而Vector支持线程同步,所以整体性能相对较低,如果没有多线程的场景,不建议使用Stack。

stack类图为:

在这里插入图片描述

举例:

//栈的实现一,内置类
//底层实现: Vector class Stack<E> extends Vector<E>
//由于Vector支持线程同步,所以效率比较低
Stack<Integer> stack = new Stack<>();
stack.push(1);  //插入元素
stack.pop();    //弹出栈顶元素
stack.peek();      //查看栈顶元素
int n = stack.size();   //栈的大小
System.out.println(stack.isEmpty());    //判断栈是否为空

(2)LinkedList实现

LinkedList实现了List,Deque(实现了Queue接口)的接口,底层是双向链表实现的,所以不仅可以表示栈,也可以表示队列。

举例:

//栈的实现二:LinkedList
/*LinkedList底层实现了Deque双端队列的接口,双端队列,完全可以实现栈的功能public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>,*/
Deque<Integer> stack2 = new LinkedList<>();
stack2.push(1);     //插入元素
stack2.push(2);     //插入元素//        stack2.offer(3);    //offer和push都可以插入元素,但是push是队尾插入,offer是队首
System.out.println(stack2);
int m = stack2.peek();          //取栈顶元素,peek是2
System.out.println(m);          //结果为2
m = stack2.getFirst();          //取栈顶第一个元素
System.out.println(m);          //结果为2
stack2.pop();         		    //删除栈顶元素

队列

(1)使用LinkedList实现队列

底层是链表

public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();// 添加元素到队列尾部queue.offer(1);queue.offer(2);queue.offer(3);// 获取队列头部元素并删除int head = queue.poll();System.out.println("Head of the queue: " + head);// 获取队列头部元素但不删除int peek = queue.peek();System.out.println("Peek of the queue: " + peek);// 遍历队列中的元素System.out.println("Elements in the queue: ");for (Integer element : queue) {System.out.println(element);}}
}

(2)使用ArrayDeque实现队列

底层是数组实现

    public static void main(String[] args) {//使用ArrayQueue实现队列Queue<Integer> queue = new ArrayDeque<>();// 添加元素到队列尾部queue.offer(1);queue.offer(2);queue.offer(3);// 获取队列头部元素并删除int head = queue.poll();System.out.println("Head of the queue: " + head);// 获取队列头部元素但不删除int peek = queue.peek();System.out.println("Peek of the queue: " + peek);// 遍历队列中的元素System.out.println("Elements in the queue: ");for (Integer element : queue) {System.out.println(element);}}

(3)双端队列

Deque(双端队列)是一种具有队列和栈的特性的数据结构,它允许在队列的头部和尾部进行元素的插入和删除操作。在Java中,Deque接口提供了对双端队列的定义,它是Queue接口的一个子接口。

使用Deque可以进行以下操作:

  1. 在队列头部插入元素:可以使用addFirst()或者offerFirst()方法在队列的头部插入一个元素。
  2. 在队列尾部插入元素:可以使用addLast()或者offerLast()方法在队列的尾部插入一个元素。
  3. 从队列头部删除元素:可以使用removeFirst()或者pollFirst()方法从队列的头部删除一个元素。
  4. 从队列尾部删除元素:可以使用removeLast()或者pollLast()方法从队列的尾部删除一个元素。
  5. 获取队列头部的元素:可以使用getFirst()或者peekFirst()方法获取队列头部的元素,但不会将其从队列中删除。
  6. 获取队列尾部的元素:可以使用getLast()或者peekLast()方法获取队列尾部的元素,但不会将其从队列中删除。
  7. 判断队列是否为空:可以使用isEmpty()方法判断队列是否为空。
  8. 获取队列的大小:可以使用size()方法获取队列中元素的个数。
  9. offer()方法:用于在队列尾部插入元素,如果插入成功则返回true,否则返回false。它类似于add()方法,但不同之处在于当队列已满时,add()方法会抛出异常,而offer()方法会返回false。
  10. push()方法:用于在队列头部插入元素,即将元素压入栈顶。它等效于addFirst()方法。与offer()方法类似,如果插入成功则返回true,否则抛出异常。

Deque接口有多个实现类可供使用,Java提供了两个常用的实现类:

  1. LinkedList:基于链表实现的双端队列,支持快速插入和删除操作,但在随机访问和迭代性能上相对较慢。
  2. ArrayDeque:基于数组实现的双端队列,支持快速随机访问和插入删除操作,内存占用较小。但在大量元素的插入删除操作中,可能需要重新调整内部数组的容量,导致时间复杂度稍高。

举例:

public class DequeExample {public static void main(String[] args) {Deque<Integer> deque = new ArrayDeque<>();// 在队列头部插入元素deque.addFirst(1);deque.offerFirst(2);// 在队列尾部插入元素deque.addLast(3);deque.offerLast(4);// 从队列头部删除元素int first = deque.removeFirst();System.out.println("Removed from first: " + first);// 从队列尾部删除元素int last = deque.removeLast();System.out.println("Removed from last: " + last);// 获取队列头部的元素int peekFirst = deque.peekFirst();System.out.println("Peek from first: " + peekFirst);// 获取队列尾部的元素int peekLast = deque.peekLast();System.out.println("Peek from last: " + peekLast);// 遍历队列中的元素System.out.println("Elements in the deque:");for (Integer element : deque) {System.out.println(element);}// 判断队列是否为空boolean isEmpty = deque.isEmpty();System.out.println("Is deque empty? " + isEmpty);// 获取队列的大小int size = deque.size();System.out.println("Size of the deque: " + size);}
}

LinkedList

LinkedList在栈和队列中均有应用,Linkedlist也有很多方法,下面对LinkedList的方法进行总结。

增加:add/offer/push/addFrist/offerFrist/offerLast等等
删除:remove/pop/poll/pollFirst/pollLast等等
如何进行区分?

这些方法分别来自于集合Collections,队列Queue,栈Stack,双端队列Deque,每对方法都有一定的含义,不建议笼统归为添加/删除。

LinkedList类图为:

在这里插入图片描述

LinkedList实现了以上Deque,Queue,List,Collection的所有的方法。

  • addremove是一对,源自Collection

    • 添加到队尾,从队头删除;
  • offerpoll是一对,源自Queue

    • 队列(先进先出 => 尾进头出),所以添加到队尾,从队头删除;
  • pushpop是一对,源自Deque,其本质是栈(Stack类由于某些历史原因,官方已不建议使用,使用Deque代替);

    • 栈(先进后出 => 头进头出),所以添加到队头,从队头删除;
  • offerFirst/offerLastpollFirst/pollLast是一对,源自Deque,其本质是双端队列。

    • 双端队列(两端都可以进也都可以出),根据字面意思,offerFirst添加到队头,offerLast添加到队尾,pollFirst从队头删除,pollLast从队尾删除。

在使用的时候,建议根据用途来使用不同的方法,比如你想把LinkedList当做集合list,那么应该用add/remove,如果想用作队列,则使用offer/poll,如果用作栈,则使用push/pop,如果用作双端队列,则使用offerFirst/offerLast/pollFirst/pollLast

offerLast添加到队尾,pollFirst从队头删除,pollLast从队尾删除

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

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

相关文章

【C语言入门】浮点型数据在内存中的存储

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 ​编辑 引言 引例 一、浮点型在内存中的存储方式 1.1 …

Linux 时间系统调用

UNIX及LinuxQ的时间系统是由「新纪元时间」Epoch开始计算起。Epoch是指定为1970年1月1日凌晨零点零分零秒&#xff0c;格林威治时间。目前大部份的UNX系统都是用32位来记录时间&#xff0c;正值表示为1970以后&#xff0c;负值则表示1970年以前。 对于当前时间到Epoch 我们用两…

2024蓝桥杯每日一题(DFS)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;奶牛选美 试题二&#xff1a;树的重心 试题三&#xff1a;大臣的差旅费 试题四&#xff1a;扫雷 试题一&#xff1a;奶牛选美 【题目描述】 听说最近两斑点的奶牛最受欢迎&#xff0c;…

后端系统开发之——创建SpringBoot工程

原文地址&#xff1a;后端框架系统开发之——创建SpringBoot工程 - Pleasure的博客 下面是正文内容&#xff1a; 前言 现在的市场环境&#xff0c;如果你单单只是作为前端工程师或者是后端工程师&#xff0c;在开发Web应用的时候都需要去读取企业提供的接口文档。而当你前后端…

没想到打脸这么快,AI程序员已经出发了!

大家好啊&#xff0c;我是豆小匠。 先介绍一下本期的主角&#xff1a;Devin&#xff0c;世界上第一位AI程序员&#xff0c;由2023年11月成立的10人初创公司Cognition AI开发。 1. AI程序员已经能做到什么程度 3月13日&#xff0c;Cognition AI公司在X平台&#xff08;原推特&…

关于volatile与指令重排序的探讨

写在开头 在之前的学习我们了解到&#xff0c;为了充分利用缓存&#xff0c;提高程序的执行速度&#xff0c;编译器在底层执行的时候&#xff0c;会进行指令重排序的优化操作&#xff0c;但这种优化&#xff0c;在有些时候会带来 有序性 的问题。 那何为有序性呢&#xff1f;…

LeetCode Python - 57. 插入区间

目录 题目描述解法方法一&#xff1a;排序 区间合并方法二&#xff1a;一次遍历 运行结果方法一&#xff1a;排序 区间合并方法二&#xff1a;一次遍历 题目描述 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需…

MySQL语法分类 DQL(1)基础查询

//语法 select 字段列表 from 表名列表 where条件列表 group by分组字段 having 分组后的条件 order by排序 limit 分页限定为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),ma…

数据的响应式:实现动态数据驱动的技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

rt-thread之通讯协议modbus软件包的使用记录(lwip+modbus组合)

前言 使用freemodbus软件包使用网口通讯(sallwip)ip地址使用dhcp动态获取 软件包 相关宏定义 /*-----------------------------------------NET 宏定义-------------------------------------------*/#define RT_USING_SAL #define SAL_INTERNET_CHECK /* Docking with prot…

App拉新必备!Xinstall渠道追踪,让每一分钱都花在刀刃上

在移动互联网时代&#xff0c;App已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;对于App开发者来说&#xff0c;如何有效地进行拉新&#xff0c;提高用户留存率&#xff0c;一直是一个难题。而渠道追踪&#xff0c;作为App推广过程中的重要环节&#xff0c;往往被忽…

Prometheus + Grafana 监控解决方案介绍及部署

Prometheus Grafana 监控解决方案介绍 Prometheus&#xff08;普罗米修斯&#xff09;是一套开源的 监控&报警&时间序列 数据库 的组合&#xff0c;起始是由SoundCloud公司开发。 随着发展&#xff0c;越来越多公司和组织接受采用Prometheus&#xff0c;社区也十分活…

【Spark编程基础】RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

【LabVIEW FPGA入门】浮点数类型支持

如今&#xff0c;使用浮点运算来设计嵌入式系统的需求变得越来越普遍。随着 FPGA 因其固有的大规模并行性而在浮点性能方面继续超越微处理器&#xff0c;这种情况正在加剧。线性代数和数字信号处理 (DSP) 等高级算法可以受益于浮点数据类型的高动态范围精度。LabVIEW FPGA 通过…

【Godot4自学手册】第二十五利用PointLight2D节点点缀夜晚灯光

夜晚来临了&#xff0c;少不了灯光的出现&#xff0c;今天就用PointLight2D节点来实现夜晚的忽闪忽闪灯光效果。 一、添加场景 1、添加PointLight2D场景 单击添加新节点按钮&#xff0c;在场景面板中选择其他节点&#xff0c;在弹出创建Node对话框中选择 PointLight2D&#…

Vue中使用Lodash

Vue中使用Lodash 前言安装Lodash引用方法vue中使用1、cloneDeep 深拷贝2、uniq 数组去重3、uniqWith 数组对象去重 isEqual 深度比对4、intersection 提取数组相同元素5、chunk 数组切分6、compact去除假值7、reject:根据条件删除指定的值8、find:查找结果的第一个值9、filter:…

基于sortablejs实现拖拽element-ui el-table表格行进行排序

可以用原生的dragstart、drag、dragend、dragover、drop、dragleave实现这个效果&#xff0c;但是有现成的轮子就不要重复造了&#xff0c;看效果&#xff1a; <template><el-table :class"$options.name" :data"tableData" ref"table"…

Android Kotlin知识汇总(一)编程语言

在 2019 年 Google I/O 大会上宣布今后将优先采用 Kotlin 进行 Android 开发。Kotlin 是一种富有表现力且简洁的编程语言&#xff0c;不仅可以减少常见代码错误&#xff0c;还可以轻松集成到现有应用中。如果您想构建 Android 应用&#xff0c;建议您从 Kotlin 开始着手&#x…

java.lang.NoSuchMethodException异常解决

标题 java.lang.NoSuchMethodException异常的正确解决方法摘要&#x1f680; 异常介绍&#x1f9d0; 异常原因分析&#x1f6e0; 解决方法核对方法名称和参数使用正确的方法签名调整方法访问权限 &#x1f4dd; 解决步骤详解&#x1f5a5; 代码案例演示❓ QA部分Q: 如何区分jav…

使用canvas实现图纸标记及回显

图纸 图纸标记后的效果图 最近做的一个qms项目里面&#xff0c;需要前端在图纸上实现标记及标记后的内容还要能够回显&#xff0c;然后后端通过标记的点&#xff0c;去读取标记图纸的内容&#xff0c;如一些公式、数据之类的&#xff0c;目前实现的功能有 在图纸上面进行矩形…