登神长阶
第三神装 Stack
第四神装 Queue
目录
🔋一.栈 Stack
💻1.概念
🖥️2.基本操作
🖨️3.相关OJ题
🖱️4.栈、虚拟机栈和栈帧的区别
🪫二.队列 Queue
🖲️1.概念
💽2.基本操作
🔌三.总结与反思
🔋一.栈 Stack
💻1.概念
在 Java 中,栈(Stack)是一种后进先出(LIFO)的数据结构,用于存储元素。在栈中,只有栈顶的元素是可见的和可访问的,其他元素都被隐藏起来,直到栈顶的元素被移除或弹出。Java 中的 java.util.Stack
类实现了这种栈的数据结构,并且是线程安全的,继承自 Vector
类。
🖥️2.基本操作
方法
|
功能 |
Stack() | 构造一个空的栈 |
E push(E e) | 将e入栈,并返回e |
E pop() | 将栈顶元素出栈并返回 |
E peek() | 获取栈顶元素 |
int size() |
获取栈中有效元素个数
|
boolean empty() | 检测栈是否为空 |
示例
以下是一个使用 Stack
类的简单示例:
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
// 压栈操作
stack.push("Java");
stack.push("Python");
stack.push("C++");
// 弹栈操作
String topLanguage = stack.pop();
System.out.println("弹出栈顶元素:" + topLanguage);
// 查看栈顶元素
String currentTop = stack.peek();
System.out.println("当前栈顶元素:" + currentTop);
// 判空操作
if (stack.isEmpty()) {
System.out.println("栈为空");
} else {
System.out.println("栈不为空");
}
}
}
这个示例展示了栈的基本操作,包括压栈、弹栈、查看栈顶元素和判空。栈在 Java 中常用于处理需要后进先出顺序的场景,例如表达式求值、逆序输出等。
🖨️3.相关OJ题
文章来源地址https://www.toymoban.com/news/detail-859619.html
逆波兰表达式
🖱️4.栈、虚拟机栈和栈帧的区别
-
栈(Stack):
- 在计算机科学中,栈是一种数据结构,遵循后进先出(LIFO)的原则,用于存储和管理函数调用、局部变量和临时数据。
- 栈通常由操作系统提供支持,用于管理程序的执行环境和内存分配。
-
虚拟机栈(Java Virtual Machine Stack):
- 虚拟机栈是 Java 虚拟机在执行 Java 程序时使用的内存区域之一,与线程生命周期相同。
- 每个线程在创建时都会分配一个对应的虚拟机栈,用于存储方法的调用栈帧(Stack Frame)、局部变量表、操作数栈等信息。
- 虚拟机栈中的栈帧存储了方法的运行时数据结构,每个方法的调用都会创建一个对应的栈帧。
-
栈帧(Stack Frame):
- 栈帧是虚拟机栈中的一个重要概念,用于表示方法在虚拟机中的运行状态和执行信息。
- 每个方法的调用都会对应一个栈帧,包含局部变量表、操作数栈、动态链接、返回地址等部分。
- 当方法被调用时,会创建一个新的栈帧压入虚拟机栈,并在方法执行完毕后弹出栈帧,恢复上一个调用栈帧的执行。
区别总结:
- 栈 是一种数据结构,用于存储和管理数据,具有后进先出的特性。
- 虚拟机栈 是 Java 虚拟机提供的内存区域,用于存储线程的方法调用栈帧和相关数据。
- 栈帧 是虚拟机栈中的一个部分,用于表示方法的运行状态和执行信息,包含局部变量表、操作数栈等。
🪫二.队列 Queue
🖲️1.概念
在 Java 中,队列(Queue)是一种先进先出(FIFO)的数据结构,用于存储元素。队列在 java.util
包中有多种实现,如 LinkedList
、ArrayDeque
和 PriorityQueue
。只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)
💽2.基本操作
方法
|
功能 |
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());
}
}
这个示例展示了队列的基本操作,包括入队、出队、查看队头元素和判空。队列在 Java 中常用于实现任务调度、消息传递等场景,能够有效管理元素的顺序和执行顺序。
🔌三.总结与反思
💡人类也需要梦想者,这种人醉心于一种事业的大公无私的发展,因而不能注意自身的物质利益。——居里夫人
在学习 Java 中的栈(Stack)和队列(Queue)这两种经典数据结构时,我深刻体会到它们的重要性和应用广泛性。通过掌握栈和队列的基本操作,如入栈、出栈、入队、出队,我加深了对数据结构的理解。
在实践中,我意识到需要关注空间复杂度和时间复杂度的问题,尤其在处理大规模数据集时。异常处理也是学习中的重要环节,确保程序能够正常处理各种边界情况。了解栈和队列在算法和程序设计中的应用场景,如表达式求值、任务调度等,为我提供了有效的工具。通过深入研究 Java 中不同的栈和队列实现类,我学习了它们的特性和使用方法。
我希望进一步应用所学知识,深入探索栈和队列在更复杂算法和数据结构中的应用,提升自己的编程能力。通过不断练习和实践,我相信能够更熟练地运用栈和队列,解决实际问题,并在日常开发中发挥它们的作用。我的学习之路将持续前行,为未来的软件开发工作做好准备。
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐
制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸文章来源:https://www.toymoban.com/news/detail-859619.html
到了这里,关于Java 【数据结构】 栈(Stack)和队列(Queue)【神装】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!