恶补基础知识:Java 栈与队列详解
@
前言
请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、
提示:以下是本篇文章正文内容,下面案例可供参考
简介
使用Java实现 栈(Stack)
和 队列(Queue)
的操作是很常见的任务。栈和队列是两种不同的数据结构,它们分别具有特定的操作和行为。
栈
栈是一种 后进先出(LIFO, Last In First Out)
的数据结构。它只允许在栈顶进行添加(push)或删除(pop)元素的操作。类似于羽毛球球桶一样最开始放进去的球需要最后拿出来
Java实现栈的示例代码:
public static void query() {
Queue<Integer> queue = new LinkedList<>();
// 入队
queue.offer(1);
queue.offer(2);
queue.offer(3);
// 查看队首元素
System.out.println("队首元素: " + queue.peek()); // 不移除队首元素
// 出队
while (!queue.isEmpty()) {
System.out.println("出队元素: " + queue.poll());
}
}
public static void stack() {
//1、创建栈:使用Stack类(尽管Stack是遗留类,更推荐使用Deque接口的实现如ArrayDeque)或Deque接口(及其实现类如ArrayDeque)来实现栈。
//Stack<Integer> stack = new Stack<Integer>();
Deque<Integer> stack = new ArrayDeque<>();
//2、入栈将元素添加到栈顶
stack.push(1);
stack.push(2);
stack.push(3);
//3、出栈(Pop):从栈顶移除元素,并返回被移除的元素。Stack类提供了pop()方法用于出栈操作
int element = stack.pop(); // 返回并移除栈顶元素
System.out.println(element); // 输出:3
// 4、访问栈顶元素(Peek):获取栈顶元素,但不对栈进行修改。Stack类提供了peek()方法用于访问栈顶元素
int outElement = stack.peek(); // 返回栈顶元素但不移除
System.out.println("栈顶元素: " + outElement); // 输出:3
// 5、循环出栈
while (!stack.isEmpty()) {
System.out.println("出栈元素: " + stack.pop());
}
/*输出:
栈顶元素: 3
出栈元素: 3
出栈元素: 2
出栈元素: 1*/
}
栈的主要应用场景包括:
函数调用栈:
在编程语言中,函数调用是通过栈来实现的。当函数被调用时,它的局部变量、参数和返回地址等信息会被压入栈中。当函数执行完毕时,这些信息会从栈中弹出,控制权返回给调用者。浏览器的前进后退:
浏览器的历史记录通常使用栈来管理。当我们浏览网页时,每个访问的页面都会被压入栈中;当我们点击“后退”时,页面会从栈中弹出,返回到上一个页面。括号匹配:
在解析或编译代码时,检查圆括号、花括号等是否匹配是一个常见问题。栈可以用来解决这个问题,每当遇到一个左括号时,就将其压入栈中;每遇到一个右括号时,就检查栈顶元素是否与之匹配,如果匹配则弹出栈顶元素,否则报错。撤销操作:
在许多编辑器或图形界面中,用户可以通过撤销操作回到之前的状态。撤销操作通常使用栈来实现,每次操作都会被压入栈中,当用户执行撤销操作时,栈顶的操作会被弹出并应用于当前状态。
队列
队列是一种 先进先出(FIFO, First In First Out)
的数据结构。它只允许在队尾添加元素(enqueue)和在队首删除元素(dequeue)类似于排队的过程。
Java实现队列的示例代码:
public static void queue() {
// 1、创建队列:我们可以使用Java的集合类LinkedList来实现队列的操作。
Queue<Integer> queue = new LinkedList<>();
// 2、入队(Enqueue):将元素添加到队尾。LinkedList类提供了offer()方法用于入队操作。
queue.offer(1);
queue.offer(2);
queue.offer(3);
//3、出队(Dequeue):从队头移除元素,并返回被移除的元素。LinkedList类提供了poll()方法用于出队操作。
int element = queue.poll(); // 返回并移除队头元素
System.out.println(element); // 输出:1
// 4、访问队头元素(Peek):获取队头元素,但不对队列进行修改。LinkedList类提供了peek()方法用于访问队头元素。
System.out.println("队首元素: " + queue.peek()); // 不移除队首元素
// 5、循环出队
while (!queue.isEmpty()) {
System.out.println("出队元素: " + queue.poll());
}
/*输出:
队首元素: 1
出队元素: 1
出队元素: 2
出队元素: 3*/
}
LinkedList中的add方法和offer方法的区别
add方法: add方法属于Collection接口
,它试图将指定的元素添加到列表中。如果添加成功,它返回true;如果因为某些原因(如容量限制)添加失败,它会抛出IllegalStateException异常。在LinkedList中,当队列为空时,使用add方法可能会因为违反容量限制而报错。此外,当将LinkedList视为列表使用时,通常采用add方法来压入对象。
offer方法: offer方法属于Deque接口(双端队列)
,它试图将指定的元素插入到队列中。如果插入成功,它返回true;如果因为空间限制无法添加元素,则返回false。与add方法不同,offer方法不会抛出异常,而是通过返回值来指示操作是否成功。在有容量限制的队列中,offer方法优于add方法,因为它通过返回false来处理空间不足的情况,而不是抛出异常,这种方式更加高效
。
总结来说,add方法和offer方法的主要区别在于它们的返回值和异常处理方式。add方法可能会因为违反容量限制而抛出异常,而offer方法则通过返回值来指示操作是否成功,避免了异常处理开销。
队列主要应用场景:
任务调度:
在多任务处理系统中,任务通常被存储在一个队列中。系统按照任务进入队列的顺序来执行它们,实现了公平的调度。消息传递:
在进程间通信或网络编程中,消息通常被存储在一个队列中。发送者将消息发送到队列的尾部,接收者从队列的头部取出消息进行处理。页面请求处理:
在Web服务器中,多个用户请求可能同时到达。服务器可以将这些请求存储在一个队列中,然后按照请求到达的顺序进行处理。广度优先搜索(BFS):
在图的遍历算法中,广度优先搜索使用队列来存储待访问的节点。算法开始时,将起始节点加入队列。然后,算法循环进行,每次从队列中取出一个节点进行访问,并将其未被访问的邻接节点加入队列。
总结
了解栈和队列的应用场景有助于我们根据实际需求选择合适的数据结构,从而更高效地解决问题。
我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!
恶补基础知识:Java 栈与队列详解的更多相关文章
- Python 堆、栈和队列详解
队列: 1.队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进 ...
- 《Java基础知识》序列化与反序列化详解
序列化的作用:为了不同jvm之间共享实例对象的一种解决方案.由java提供此机制. 序列化应用场景: 1. 分布式传递对象. 2. 网络传递对象. 3. tomcat关闭以后会把session对象序列 ...
- C++ STL 栈和队列详解
一.解释: 1.栈 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行.如下所示: 结论:后进先出(Last In First Out),简称为LIFO线性表. 举个 ...
- Android基础知识之String类使用详解
原文:http://android.eoe.cn/topic/android_sdk 字符串资源为你的应用程序提供了可以选择的文本样式和格式的文本.这里有三种类型的资源可以为你的应用程序提供字符串. ...
- Java基础(54):java四种内部类详解(转)
一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类. 一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. 1.常规内部类中的方法可以直接使用外部类的实例变量 ...
- Java基础-反射(reflect)技术详解
Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制 如下图所示,JVM类加载机制分为五个部分 ...
- Java基础-变量的定义以及作用域详解
Java基础-变量的定义以及作用域详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字面量 常量(字面量)表示不能改变的数值(程序中直接出现的值).字面量有时也称为直接量,包 ...
- Java基础-DBCP连接池(BasicDataSource类)详解
Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- Java基础学习总结(24)——Java单元测试之JUnit4详解
Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before ...
随机推荐
- spring与设计模式之五委派模式
一.定义 主要突出一个安排,派遣. 这个设计模式非常常见,不需要学习也能自然而然地用上. 从广义的角度出发,一个对象用另外一个对象就是委派. 二.经典实现 略. 三.spring实例代码 https: ...
- Linux 内核:GPIO子系统(1)软件框架
Linux 内核:GPIO子系统(1)软件框架 背景 在很多驱动开发中,GPIO用得很多,因此学习一下:也会顺便看看pinctrl 子系统. 原文(有删改):http://www.wowotech.n ...
- Windows 7操作系统全面解析与实用技巧
Win7操作系统 一.操作系统的概述 1.1操作系统的概念 操作系统(operating system,简称OS)一组控制和管理计算机系统的硬件和软件资源.控制程序执行.改善人机界面.合理地组织计算机 ...
- ajax - 初步介绍
进入ajax了,想要进入vue还有一个前提就是要把ajax给熟悉一下,看一看客户端与服务器之间是怎么一个通信的过程,第一天主要是先了解了一下ajax的一些介绍,ajax嘛,在进入之前,肯定是要了解一下 ...
- Spring(注解方式)简单入门
环境准备 maven jdk Spring Eclipse 项目创建 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- DeepViT:字节提出深层ViT的训练策略 | 2021 arxiv
作者发现深层ViT出现的注意力崩溃问题,提出了新颖的Re-attention机制来解决,计算量和内存开销都很少,在增加ViT深度时能够保持性能不断提高 来源:晓飞的算法工程笔记 公众号 论文: Dee ...
- WPF单行TextBox自动滚动至末尾
根据光标位置自动滚动 textBox.CaretIndex = textBox.SelectionStart; var rect = textBox.GetRectFromCharacterIndex ...
- 敏捷开发(Scrum)
一.敏捷的背景与动机 1.1 软件危机及软件工程的出现 速度是企业竞争致胜的关键因素,软件项目的最大挑战在于,一方面要应付变动中的需求,一方面要在紧缩的时程内完成项目,传统的软件工程难以满足这些要 ...
- Vue 3 后端错误消息处理范例
1. 错误消息格式 前后端消息传递时,我们可以通过 json 的 errors 字段传递错误信息,一个比较好的格式范例为: { errors: { global: ["网络错误"] ...
- webpack性能优化方式之dll--- webpack.dll.config.js
通常来说,我们的代码都可以至少简单区分成业务代码和第三方库.如果不做处理,每次构建时都需要把所有的代码重新构建一次,耗费大量的时间.然后大部分情况下,很多第三方库的代码并不会发生变更(除非是版本升级) ...