java版数据结构:深入理解栈和队列:数据结构与应用(vector,stack,queue)

目录

前言

动态数组类(vector)

特点:

应用:

栈(Stack)

栈的基础概念:

栈的常用方法:

模拟栈操作:

队列(Queue)

队列的基础概念

队列的常用方法

双端队列(Deque)

双端队列的基础概念:

双端队列的常用方法:

结语


前言

               在计算机科学中,栈(Stack)和队列(Queue)是两种常见的数据结构,它们在算法和程序设计中扮演着重要的角色。本文将深入探讨栈和队列的概念、使用方法以及相关的应用场景。


动态数组类(vector)

Vector是Java中的一个动态数组类,它实现了一个可增长的对象数组。与普通数组相比,Vector具有以下特点:

特点:

  1. 动态增长:Vector可以根据需要动态增长或缩小其大小,无需手动管理数组大小。
  2. 线程安全:Vector是线程安全的,即可以在多线程环境下使用,但由于同步操作的开销较大,通常不推荐在单线程环境下使用。
  3. 元素访问:可以通过索引访问Vector中的元素,也可以通过迭代器遍历Vector中的元素。
  4. 实现了List接口:Vector实现了List接口,因此支持列表操作,如添加、删除、获取元素等。
  5. 遗留类:Vector是Java早期的遗留类,通常不推荐在新代码中使用。在现代Java中,更推荐使用ArrayListLinkedList等更高效的集合类。

应用:

import java.util.Vector;public class VectorExample {public static void main(String[] args) {// 创建一个Vector对象Vector<Integer> vector = new Vector<>();// 添加元素到Vectorvector.add(1);vector.add(2);vector.add(3);// 输出Vector的大小System.out.println("Vector的大小: " + vector.size());// 获取指定位置的元素System.out.println("第二个元素: " + vector.get(1));// 修改指定位置的元素vector.set(0, 10);// 移除指定位置的元素vector.remove(2);// 检查Vector是否包含某个元素if (vector.contains(2)) {System.out.println("Vector包含元素2");} else {System.out.println("Vector不包含元素2");}// 清空Vectorvector.clear();// 检查Vector是否为空if (vector.isEmpty()) {System.out.println("Vector为空");} else {System.out.println("Vector不为空");}}
}

运行结果: 


栈(Stack)

栈的基础概念:

         栈(Stack)是一种特殊的线性数据结构,具有后进先出(LIFO)的特性,即最后入栈的元素最先出栈。栈的操作主要包括压栈(push)、出栈(pop)、获取栈顶元素(peek)、获取栈中元素个数(size)以及检测栈是否为空(empty)等。

栈的常用方法:

  • 创建栈对象:
  1. 使用Stack类:可以直接使用Java提供的Stack类来创建栈对象,该类继承自Vector类,提供了压栈、出栈、获取栈顶元素等方法。
  2. 使用自定义栈类:也可以自定义栈类,通过数组或链表实现栈结构,实现压栈、出栈、获取栈顶元素等操作。
  • 基本操作方法:
  1. push(E e): 将元素压入栈顶。
  2. pop(): 弹出栈顶元素。
  3. peek(): 获取栈顶元素但不弹出。
  4. size(): 获取栈中元素个数。
  5. empty(): 检测栈是否为空。
import java.util.Stack;public class StackExample {public static void main(String[] args) {// 创建一个栈对象Stack<Integer> stack = new Stack<>();// 压栈操作stack.push(1);stack.push(2);stack.push(3);// 输出栈的大小System.out.println("栈的大小: " + stack.size());// 获取栈顶元素System.out.println("栈顶元素: " + stack.peek());// 出栈操作stack.pop();System.out.println("出栈元素: " + stack.pop());//说明输出(出栈元素)的时候,是先打印原来的栈顶元素然后再出栈System.out.println("重新获得栈顶元素:"+stack.peek());// 检查栈是否为空if (stack.empty()) {System.out.println("栈为空");} else {System.out.println("栈的大小: " + stack.size());}}
}

运行结果: 

模拟栈操作:

  1. main方法中模拟栈的操作,包括压栈、出栈、获取栈顶元素、检测栈是否为空等操作。
  2. 可以使用Java提供的Stack类或自定义的栈类进行模拟操作。
import java.util.Arrays;public class MyStack {int[] array;int size;public MyStack() {array = new int[3];}public int push(int e) {ensureCapacity();array[size++] = e;return e;}public int pop() {int e = peek();size--;return e;}public int peek() {if (empty()) {throw new RuntimeException("Stack is empty, cannot get top element");}return array[size - 1];}public int size() {return size;}public boolean empty() {return size == 0;}private void ensureCapacity() {if (size == array.length) {array = Arrays.copyOf(array, size * 2);}}
}

  • 应用场景:

    1. 改变元素的序列:通过栈可以实现元素序列的逆序。
    2. 将递归转化为循环:使用栈可以将递归算法转化为迭代算法。
    3. 括号匹配:栈常用于检测括号是否匹配。
    4. 逆波兰表达式求值:栈可以用于求解逆波兰表达式的值。
    5. 出栈入栈次序匹配:栈可以用于检测出栈入栈次序是否匹配。
    6. 最小栈:实现一个支持常数时间内获取栈中最小元素的栈。

队列(Queue)

队列的基础概念

      队列是另一种特殊的线性表,只允许在一端进行插入数据操作,在另一端进行删除数据操作。队列遵循先进先出(FIFO)的原则,即最先入队列的元素最先出队列。在Java中,Queue是一个接口,常通过LinkedList实现。队列的模拟实现可以使用顺序结构或链式结构。

      除了普通队列,还有循环队列的概念。循环队列通常使用数组实现,通过特定的下标循环技巧来实现队列的操作。设计循环队列时需要考虑空与满的情况,可以通过添加size属性、保留一个位置或使用标记来实现。

队列的常用方法

import java.util.LinkedList;
import java.util.Queue;public class Main {public static void main(String[] args) {// 创建一个队列Queue<String> queue = new LinkedList<>();// 向队列中添加元素queue.offer("元素1");queue.offer("元素2");queue.offer("元素3");// 输出队列中的元素System.out.println("当前队列中的元素为:");for (String element : queue) {System.out.println(element);}// 出队操作String firstElement = queue.poll();System.out.println("出队的元素为:" + firstElement);// 查看队首元素String peekElement = queue.peek();System.out.println("当前队首元素为:" + peekElement);// 判断队列是否为空boolean isEmpty = queue.isEmpty();System.out.println("队列是否为空:" + isEmpty);// 获取队列大小int size = queue.size();System.out.println("当前队列大小为:" + size);}
}

运行结果: 

 


双端队列(Deque)

双端队列(Deque,全称Double-Ended Queue)是一种具有两端插入和删除操作的数据结构,它同时具备队列和栈的特性。双端队列可以在队列的两端进行元素的插入和删除操作,因此可以高效地支持在队列头部和尾部进行操作。

双端队列的基础概念:

  1. 两端操作:双端队列支持在队列的两端进行操作,即可以在队列的头部和尾部同时进行插入和删除操作。这使得双端队列既可以作为队列使用(先进先出),也可以作为栈使用(后进先出)。

  2. 插入和删除操作:双端队列提供了插入和删除元素的方法,如在队列头部插入元素、在队列尾部插入元素、在队列头部删除元素、在队列尾部删除元素等操作。

  3. 灵活性:双端队列的灵活性使得它在很多场景下都非常有用,比如需要同时支持队列和栈操作的情况,或者需要在队列的两端频繁进行操作的情况。

  4. 实现方式:双端队列可以通过数组、链表等数据结构来实现。在Java中,Deque接口定义了双端队列的基本操作,而LinkedListArrayDeque等类提供了Deque接口的实现。

双端队列的常用方法:

import java.util.ArrayDeque;
import java.util.Deque;public class Main {public static void main(String[] args) {// 创建一个双端队列Deque<String> deque = new ArrayDeque<>();// 在队列头部插入元素deque.addFirst("元素1");deque.addFirst("元素2");// 在队列尾部插入元素deque.addLast("元素3");// 输出双端队列中的元素System.out.println("当前双端队列中的元素为:");for (String element : deque) {System.out.println(element);}// 在队列头部删除元素String firstElement = deque.removeFirst();System.out.println("删除的队列头部元素为:" + firstElement);// 在队列尾部删除元素String lastElement = deque.removeLast();System.out.println("删除的队列尾部元素为:" + lastElement);// 查看双端队列头部元素String peekFirstElement = deque.peekFirst();System.out.println("当前双端队列头部元素为:" + peekFirstElement);// 查看双端队列尾部元素String peekLastElement = deque.peekLast();System.out.println("当前双端队列尾部元素为:" + peekLastElement);}
}

 运行结果:


结语

          栈和队列作为常见的数据结构,在算法和程序设计中有着重要的应用。通过深入理解栈和队列的概念、使用方法以及相关应用场景,我们可以更好地应用它们解决实际问题。同时,掌握循环队列和双端队列的概念也能够拓展我们对数据结构的认识,提高编程效率和代码质量。

希望本文能够帮助读者更好地理解和运用栈和队列,为日后的算法学习和程序设计提供帮助。

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

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

相关文章

20240502给NanoPi的NEO core开发板编译移远的4G模块的上网程序quectel-CM

20240502给NanoPi的NEO core开发板编译移远的4G模块的上网程序quectel-CM 2024/5/2 16:29 1、默认编译为AMD64/INTEL的x64架构的可执行文件&#xff1a; rootrootrootroot-ThinkBook-16-G5-IRH:~$ rootrootrootroot-ThinkBook-16-G5-IRH:~$ unzip Quectel_QConnectManager_Lin…

如何配置和使用Apollo的component里的plugin

关于如何使用Apollo的Component里的plugin&#xff0c;在Apollo的文档里只有如果和开发的说明却没有找到一个清楚完整说明怎么把plugin跑起来的说明&#xff0c;例如我想把lidar_detection_filter按我们的需求对目标过滤算法作修改然后编译完后&#xff0c;执行 cyber_launch …

2024年【浙江省安全员-C证】考试及浙江省安全员-C证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【浙江省安全员-C证】考试及浙江省安全员-C证找解析&#xff0c;包含浙江省安全员-C证考试答案和解析及浙江省安全员-C证找解析练习。安全生产模拟考试一点通结合国家浙江省安全员-C证考试最新大纲及浙江省安全…

12 Junit单元测试、反射、注解

单元测试 介绍 Junit单元测试是做什么的&#xff1f; 就是针对最小的功能单元(方法)&#xff0c;编写测试代码对其进行正确性测试。 Junit单元测试框架 可以用来对方法进行测试&#xff0c;它是由Junit公司开源出来的 Junit单元测试的优点是什么&#xff1f; 可以灵活的…

智能消费记账|基于SSM+vue的大学生智能消费记账系统(源码+数据库+文档)

智能消费记账目录 基于SSMvue的大学生智能消费记账系统 一、前言 二、系统设计 三、系统功能设计 1 用户列表 2 预算信息管理 3 预算类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

JavaScript百炼成仙自学笔记——3

外门小比 JavaScript运算符 var a 10; var b 2; var s1 a b; var s2 a - b; var s3 a * b; var s4 a / b; var a 10; var b a; var console.log(b); 同理还有a&#xff0c;就是先对a本身进行运算&#xff0c;然后再用a的值 var a 1; var b; var sum (b a--a) a--…

【Excel】excel连接数字和符号

使用“&”对数字和符号进行连接 示例&#xff1a; 将“2.6”和“&#xff0c;”连成“2.6&#xff0c;” 连接公式为&#xff1a; V3&W3 V3和W3分别是"2.6"和“&#xff0c;”在excel中的位置

Word文件导出为PDF

Word文件导出为PDF 方法一、使用Word自带另存为PDF功能 打开需要转换为PDF格式的Word文件&#xff0c;依次点击【文件】➡【另存为】➡选择文件保存类型为.PDF 使用这种方法导出的PDF可能存在Word中书签丢失的情况&#xff0c;在导出界面点击&#xff0c;选项进入详细设置 勾…

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门 1、 for i in range(4):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(6)Dev.turnRight()3、 for i in range(3):Dev.turnRight()Dev.step(2)Dev.turnLeft()Dev.step(-3)4、 for i in range(4):Dev…

GPT-1

GPT 系列是 OpenAI 的一系列预训练模型&#xff0c;GPT 的全称是 Generative Pre-Trained Transformer&#xff0c;顾名思义&#xff0c;GPT 的目标是通过 Transformer&#xff0c;使用预训练技术得到通用的语言模型。目前已经公布论文的有 GPT-1、GPT-2、GPT-3。 最近非常火的…

数据结构学习/复习4--链表的实现/链表练习题/二级指针与一级指针在链表实现中的运用

一、链表的实现&#xff08;写法不唯一&#xff0c;此处多处用二级指针&#xff09; 二、链表实现总结 1.二级指针存储一级指针 2.改变一级指针需要用到二级指针&#xff0c;本次使用二级指针进行修改 注意写法不唯一&#xff0c;也有不用二级指针写法 3.链表的结构体(节点)内…

第13章 软件测评相关标准

一、标准化概述 &#xff08;一&#xff09;概念 1、标准 一定范围内获得最佳秩序&#xff0c;经协商一致并由公认机构批准共同使用和重复使用的一种规范性文档&#xff0c;是标准化活动的核心产物。 2、标准化 一定范围内获得最佳秩序&#xff0c;对现实问题和潜在问题制…

ShellScript脚本编程(一)

什么是Shell Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务 为什么…

基于Spring Boot的校园疫情防控系统设计与实现

基于Spring Boot的校园疫情防控系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录首页界面图&#xff0c;管理员进入校园疫…

数据分析:基于DESeq2的转录组功能富集分析

介绍 DESeq2常用于识别差异基因&#xff0c;它主要使用了标准化因子标准化数据&#xff0c;再根据广义线性模型判别组间差异&#xff08;组间残差是否显著判断&#xff09;。在获取差异基因结果后&#xff0c;我们可以进行下一步的富集分析&#xff0c;常用方法有基于在线网站…

## CSDN创作活动:缓解工作压力:程序员的健康之道

缓解工作压力&#xff1a;程序员的健康之道 在当今快节奏的社会中&#xff0c;程序员作为一个高度专业化和技术密集的群体&#xff0c;往往需要面对持续的工作压力和创新挑战。在如此高强度的工作环境下&#xff0c;如何有效缓解工作压力&#xff0c;保持工作效率和个人健康成…

Java线程池的七大参数说明

线程池中的七大参数如下&#xff1a; &#xff08;1&#xff09;corePoolSize&#xff1a;线程池中的常驻核心线程数。 &#xff08;2&#xff09;maximumPoolSize&#xff1a;线程池能够容纳同时执行的最大线程数&#xff0c;此值大于等于1。 &#xff08;3&#xff09;keepAl…

Recruit App

招聘类APP小程序

【Vulhub靶场】Nginx 漏洞复现

Nginx 漏洞复现 一、Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09;1、影响版本2、漏洞原理3、漏洞复现 二、Nginx 解析漏洞1、版本信息&#xff1a;2、漏洞详情3、漏洞复现 一、Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09; 1、影响版本 Nginx …

HSDB使用教程

HSDB&#xff1a;Hostspot Debugger&#xff0c;JVM内置的工具&#xff0c;用于深入分析JVM运行时的内部状态 启动HSDB java -cp D:/tools/jdk-1.8/lib/sa-jdi.jar sun.jvm.hotspot.HSDB 获取进程id jps 连接到指定进程 查找类 通过查询查找对象 输入查询语句 select d from …