Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
正月初九,开工大吉!
2024年,更上一层楼!
写在开头
其实在List的继承关系中,除了ArrayList和LinkedList之外,还有另外一个集合类stack(栈),它继承自vector,线程安全,先进后出,随着Java并发编程的发展,它在很多应用场景下被逐渐替代,成为了Java的遗落之类。不过,stack在数据结构中仍有一席之地,因此,我们有必要也应该好好的学一下!
Collection和Collections的区别?
在开始学习栈之前,先来解决一下之前一个网友在评论区问的问题:
Collection和Collections有什么区别?
虽然这两个类都在java.util包下,虽然只有一字之差,但它们的差别还是挺大的!
Collection 是JDK中集合层次结构中的最根本的接口。定义了集合类的基本方法。源码中的解释:
* The root interface in the <i>collection hierarchy</i>. A collection
* represents a group of objects, known as its <i>elements</i>. Some
* collections allow duplicate elements and others do not. Some are ordered
* and others unordered. The JDK does not provide any <i>direct</i>
* implementations of this interface: it provides implementations of more
* specific subinterfaces like <tt>Set</tt> and <tt>List</tt>. This interface
* is typically used to pass collections around and manipulate them where
* maximum generality is desired.
Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法,不能实例化,Collection 集合框架的工具类。源码中的解释:
* This class consists exclusively of static methods that operate on or return
* collections. It contains polymorphic algorithms that operate on
* collections, "wrappers", which return a new collection backed by a
* specified collection, and a few other odds and ends.
stack(栈)
栈(stack)是一种先进后出(Last In First Out,LIFO)的数据结构,类比于现实生活中的子弹上膛、泡泡圈。栈具有两个基本操作:入栈(push)和出栈(pop)。入栈表示将元素放入栈顶,而出栈表示从栈顶取出元素。
动图图解-入栈(push)

动图图解-出栈(pop)

在Java的工具包中其实帮我们封装好了一个类,java.util.Stack,它所提供的方法并不多,我们通过一个小示例感受一下。
【代码示例1】
Stack<String> stacks = new Stack<>();
//push方法入栈
stacks.push("开");
stacks.push("工");
stacks.push("大");
stacks.push("吉");
stacks.push("!");
System.out.println(stacks);
//pop栈顶元素出栈
String pop = stacks.pop();
System.out.println(pop);
//查看栈顶元素
String peek = stacks.peek();
System.out.println(peek);
//判断堆栈是否为空
boolean empty = stacks.empty();
System.out.println(empty);
//查看元素在堆栈中的位置
int index = stacks.search("开");
System.out.println(index);
输出:
[开, 工, 大, 吉, !]
!
吉
false
4
手写一个stack(堆栈)
通过上面的代码示例我们了解了一个栈所具备的功能特点,根据它的特点,我们尝试一下手写一个栈!
首先,准备一个数组用来存储元素,可以定义为Object,这样支持多数据类型,我们这里直接选用int类型的好嘞。
自定义栈-源码:
/**
* @ClassName Stack
* @Description 手写一个int类型的堆栈
* @Author hzm
* @Date 2024/2/18 14:21
* @Version 1.0
*/
public class Stack {
private int arr[];
private int top;
private int capacity;
/**
* 提供一个有参构造,初始化栈
* @param size
*/
public Stack(int size) {
this.arr = new int[size];
this.top = -1;
this.capacity = size;
}
/**
* 入栈
* @param p
*/
public void push(int p) {
if (isFull()) {
System.out.println("堆栈空间溢出\n程序终止\n");
System.exit(1);
}
System.out.println("入栈:" + p);
arr[++top] = p;
}
/**
* 出栈
* @return
*/
public int pop() {
if (isEmpty()) {
System.out.println("空栈,不可POP");
System.exit(1);
}
return arr[top--];
}
/**
* 判断栈是否已满
* @return
*/
public Boolean isFull() {
return top == capacity - 1;
}
/**
* 判断栈是否为空
* @return
*/
public Boolean isEmpty() {
return top == -1;
}
/**
* 遍历栈内元素
*/
public void printStack() {
for (int i = 0; i <= top; i++) {
System.out.println(arr[i]);
}
}
/**
* 返回栈的大小
* @return
*/
public int size() {
return top + 1;
}
/**
* 查看栈顶元素
* @return
*/
public void peek(){
System.out.println("栈顶元素:" + arr[top]);
}
}
测试类中调用手写的这个stack:
public class Test {
public static void main(String[] args) {
Stack stack = new Stack(5);
//入栈
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
//出栈
int pop = stack.pop();
System.out.println("出栈:"+ pop);
//查看栈的大小
int size = stack.size();
System.out.println("栈容量:" + size);
//查看栈顶元素
stack.peek();
//打印栈内元素
stack.printStack();
}
}
输出:
入栈:1
入栈:2
入栈:3
入栈:4
入栈:5
出栈:5
栈容量:4
栈顶元素:4
1
2
3
4
好了,今天的栈内容就写到这里吧,大家私下里可以找找leetcode上关于栈的算法题做做,深刻感受一下哈!
结尾彩蛋
如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?的更多相关文章
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- Java集合(3):Vector && Stack
一.Vector介绍 Vector可以实现可增长的动态对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删 ...
- 不可错过的java面试博客之java集合篇
1. List List 是有序的 Collection.Java List 一共三个实现类: 分别是 ArrayList.Vector 和 LinkedList ArrayList ArrayLis ...
- 爬虫入门 手写一个Java爬虫
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- Java手写一个批量获取数据工具类
1. 背景 偶尔会在公司的项目里看到这样的代码 List<Info> infoList = new ArrayList<Info>(); if (infoidList.size ...
- 超详细的Java面试题总结(三)之Java集合篇常见问题
List,Set,Map三者的区别及总结 List:对付顺序的好帮手 List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set:注重独一无二的性质 不允许重复的集合.不会有多个元 ...
- Java集合篇六:Map中key值不可重复的测试
package com.test.collection; import java.util.HashMap; import java.util.Map; //Map中key值不可重复的测试 publi ...
- Java集合篇五:HashMap
1.HasMap 自定义基础版 package com.test.collection; /** * 自定义实现Map功能 * map :存放键值对,根据键对象找对应的值对象 * @author ch ...
- Java集合篇四:Map的基本应用
package com.test.collection; import java.util.HashMap; import java.util.Hashtable; import java.util. ...
- Java集合篇三:Vector
package com.test.collection; import java.util.Vector; public class MyVector { /** * @param args */ p ...
随机推荐
- 机器学习-决策树系列-决策树-剪枝-CART算法-27
目录 1. 剪枝 2. CCP-代价复杂度剪枝(CART) 4. α值的确定 1. 剪枝 将子树还原成一个叶子节点: 是解决过拟合的一个有效方法.当树训练得过于茂盛的时候会出现在测试集上的效果比训练集 ...
- arthas 使用总结
本文为博主原创,未经允许不得转载: Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱.在线排查问题,无需重启:动态跟踪Java代码:实时监控JVM状态. Github: https ...
- spring-transaction源码分析(4)AspectJ和spring-aspects模块
AspectJ是Java语言实现的一个面向切面编程的扩展库,能够基于一定的语法编写Aspect代码,使用ajc编译器将其编译成.class文件,之后在Java程序编写或加载时将Aspect逻辑嵌入到指 ...
- crypto常用工具
古典密码 维吉尼亚密码(Vigenere): https://github.com/atomcated/Vigenere(加密解密程序,包含自动猜测密钥功能) https://www.guballa. ...
- css - absolute居中
position:absolut; left:50%; top:50%; margin-left: -(自身一半宽度); margin-top: -(自身一半高度)
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.02)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- 重写SpringCloudGateway路由查找算法,性能提升100倍!
如果你也在做SpringCloudGateway网关开发,希望这篇文章能给你带来一些启发 背景 先说背景,某油项目,通过SpringCloudGateway配置了1.6万个路由规则,实际接口调用过程中 ...
- [转帖]ESX/ESXi 主机上的每个插槽中安装了多少内存
https://www.cnblogs.com/reachos/p/11242302.html 要确定在 ESX/ESXi 主机上的每个插槽中安装了多少内存,请执行以下操作: 1. 启动ssh服务 2 ...
- [转帖]Zookeeper集群搭建(3个节点为例)
Zookeeper集群搭建 1.说明 本文用的linux版本:centos6,准备3台centos6虚拟机,给他们安装zookeeper,每一台的安装过程相同,你也可以安装一台,然后克隆出另外两台.主 ...
- [转帖]Arm发布CortexX4,功耗可降低40%
https://www.eet-china.com/mp/a224124.html ARM 发布了新一代的移动处理器内核,包括 Cortex-X4.Cortex-A720.Cortex-A520,预计 ...