栈和队列(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://www.mzph.cn/news/752098.shtml

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

相关文章

Docker入门一(Docker介绍、Docker整体结构、Docker安装、镜像、容器、Docker的容器与镜像)

文章目录 一、Docker介绍1.什么是虚拟化2.虚拟化模块3.docker是什么4.docker平台介绍5.为什么使用docker6.docker主要解决的问题 二、docker整体结构1.Docker引擎介绍&#xff08;Docker Engine&#xff09;2.Docker结构概览介绍3.Docker底层技术 三、docker安装1.Docker-CE和D…

Git——分支详解

目录 Git分支1、开始使用分支1.1、新增分支1.2、更改分支名称1.3、删除分支1.4、切换分支1.5、切换分支时1.6、要切换到哪个分支&#xff0c;首先要有那个分支 2、分支原理2.1、单个分支2.2、多个分支2.3、切换分支时的逻辑1、更新暂存区和工作目录2、变更HEAD的位置 2.4、如果…

GPT-4.5 Turbo详细信息被搜索引擎泄露:有重大改进

3月14日消息&#xff0c;据外电报道&#xff0c;OpenAI 最新人工智能模型 GPT-4.5 Turbo 的详细信息已通过 Bing 和 DuckDuckGo 的搜索引擎索引过早泄露。 GPT-4.5 Turbo 的产品页面在正式发布之前就出现在搜索结果中&#xff0c;引发了人们对 OpenAI 最新型号的特性和功能的猜…

每周一算法:双向深搜

题目描述 达达帮翰翰给女生送礼物&#xff0c;翰翰一共准备了 N N N 个礼物&#xff0c;其中第 i i i 个礼物的重量是 G [ i ] G[i] G[i]。 达达的力气很大&#xff0c;他一次可以搬动重量之和不超过 W W W的任意多个物品。 达达希望一次搬掉尽量重的一些物品&#xff0c;请…

微服务:Sentinel篇

1. 初识Sentinel 1.1. 雪崩问题以及解决方案 1.1.1. 雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此…

静默安装OGG21.3微服务版本FOR ORACLE版本

静默安装OGG21.3微服务版本FOR ORACLE版本 silent install ogg21.3 for oracle 某度找来找去都没有找到一份可靠的静默安装OGG21.3微服务版本的案例&#xff0c;特别难受&#xff0c;为此将自己静默安装的步骤一步步贴出来分享给大家&#xff0c;请指点&#xff0c;谢谢。 至…

Web Speech API的语音识别技术

SpeechSynthesis对象 这是一个实验性技术 目前兼容性如图&#xff1a; pc端几乎兼容&#xff0c;移动端部分不兼容 网页语音 API 的SpeechSynthesis 接口是语音服务的控制接口&#xff1b; 它可以用于获取设备上关于可用的合成声音的信息&#xff0c;开始、暂停语音&#x…

软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

从电影《沙丘》说起——对人工智能的思考

从《沙丘》开始说起 之前看《沙丘》电影&#xff0c;里面有一类角色叫门泰特&#xff0c;这类人大脑可以飞快地运算&#xff0c;在电影设定里是替换人工智能、机器运算的存在。男主保罗也是这类型的人&#xff0c;但他可能基因更强大&#xff0c;吸食了香料后&#xff0c;他的…

大数据面试题之SQL题

大数据面试题之SQL题 1.有一个录取学生人数表&#xff0c;记录的是每年录取学生人数和入学学生的学制 以下是表结构&#xff1a; CREATE TABLE admit ( id int(11) NOT NULL AUTO_INCREMENT, year int(255) DEFAULT NULL COMMENT ‘入学年度’, num int(255) DEFAULT NULL COMM…

Day67:WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网

知识点&#xff1a; 1、Java安全-RCE执行-5大类函数调用 2、Java安全-JNDI注入-RMI&LDAP&高版本 3、Java安全-不安全组件-Shiro&FastJson&JackJson&XStream&Log4j Java安全-RCE执行-5大类函数调用 Java中代码执行的类&#xff1a; GroovyRuntimeExecPr…

Dockerfile 语法详解

Dockerfile 是一种文本文件&#xff0c;用于定义如何构建 Docker 镜像。它包含一系列指令&#xff0c;用于创建镜像的各个层&#xff0c;最终生成一个可运行的容器。 语法格式 Dockerfile 的语法遵循以下格式&#xff1a; INSTRUCTION [ARGUMENTS]其中&#xff1a; INSTRUC…

如何使用机器学习构建自己的推荐系统?

一、说明 在广阔的电子商务领域&#xff0c;众多产品和服务都在争夺我们的注意力&#xff0c;推荐系统的作用变得至关重要。这些智能系统彻底改变了我们在线发现和接触产品的方式&#xff0c;使其成为现代电子商务平台成功的基石。 推荐系统&#xff0c;通常称为推荐引擎或简称…

谈谈对数据库索引的认识

索引的概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。 可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 索引的作用 默认情况下&#xff0c;进行条件查询操作&#xff0c;就是遍历表&a…

企业数据流动安全管理软件(深度解析文章)

企业数据重要性不言而喻&#xff0c;而同时数据的流动和共享也带来了安全风险&#xff0c;如何确保企业数据在流动过程中的安全性&#xff0c;也成为了企业需要面临的重要问题。 企业数据流动安全管理软件的主要功能是监控和管理企业数据的流动过程。 它能够对企业内部的数据…

launchctl及其配置、使用、示例

文章目录 launchctl 是什么Unix / Linux类似的工具有什么哪个更常用配置使用常用子命令示例加载一个 launch agent:卸载一个 launch daemon:列出所有已加载的服务:启动一个服务:停止一个服务:禁用一个服务:启用一个服务: 附com.example.myagent.plist内容有趣的例子参考 launch…

vb.net+zxing.net随机彩色二维码、条形码

需要zxing库支持ZXing.NET Generate QR Code & Barcode in C# Alternatives | IronBarcode 效果图&#xff1a; 思路&#xff1a;先生成1个单位的二维码&#xff0c;然后再通过像素填充颜色&#xff0c;颜色数组要通过洗牌算法 洗牌算法 Dim shuffledCards As New List(…

牛客NC278 删除链表中重复的结点【中等 链表 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef 这题有一次面试某团的第一道题 思考 链表的基本操作参考答案Java import java.util.*; /*public class ListNode {int val;ListNode next null;ListNode(int val) {this.v…

【Linux杂货铺】进程的基本概念

目录 &#x1f308;前言&#x1f308; &#x1f4c1;进程的概念 &#x1f4c2;描述进程-PCB &#x1f4c2; 查看进程 &#x1f4c2; 查看正在运行的程序 &#x1f4c2;杀死进程 &#x1f4c2;通过系统调用获取进程标识符 &#x1f4c2;通过系统调用创建进程 &#x1f…

初阶结构体

在这篇文章中我们只讲一些结构体的一些基础的知识&#xff0c;后续会继续补充关于结构体的高阶知识。 1.结构体声明 1.1结构体的基本知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构可以用来描述复杂对象&#xff0c;在…