如何实现Stack栈
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要讲解了"如何实现Stack栈",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何实现Stack栈"吧!一,Stack源码分析Stack,栈,
千家信息网最后更新 2025年02月02日如何实现Stack栈
这篇文章主要讲解了"如何实现Stack栈",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何实现Stack栈"吧!
一,Stack源码分析
Stack,栈,也是数据结构的一种,对于java应用开发者而言,我使用栈的应用场景比较少,一般做做算法类的题会用到,对于实际的应用场景我觉得栈还是比较厉害的一种数据结构,栈的特点嘛,先进后出,后进先出。
二,方法分析
其实,怎么说呢,我分析过了Vector集合的源码分析了,然而栈继承了Vector类,所以,你懂得,栈就是Vector集合的一种特例了,所以,这篇文章会很简短,但是我还是来分析了。
Vector集合最全面的源码分析
2.1,栈结构继承结构
//记住和理解java类的"单继承,多实现"的特点哈
public class Stack extends Vector {}
2.2,构造函数
//一个无参构造函数
public Stack() {
}
2.3,push()方法
其实,栈也是看作一种集合嘛,集合就是用来装填数据元素的嘛,所以我们接下来就是分析栈的各种方法了,如何装填数据元素呢,当然了,我们要看下push()方法了。
public E push(E item) {
//看下第二步操作
addElement(item);
return item;
}
//第二步操作
public synchronized void addElement(E obj) {
//modCount的含义下面的这个解释已经很形象了
//The number of times this list has been modified
modCount++;
//这一步就是扩容操作了,这里不分析了,可以看下vector源码分析这篇文章
ensureCapacityHelper(elementCount + 1);
//将元素装填在数组中
elementData[elementCount++] = obj;
}
2.4,pop()方法
public synchronized E pop() {
E obj;
//第二步操作,获取栈的大小
int len = size();
//第三步操作,调用peek()方法获取栈顶元素位置
obj = peek();
//第四步操作,将栈顶的元素删除,就达到了pop()的功能
//等下一起分析下peek()方法
removeElementAt(len - 1);
return obj;
}
//第二步操作
public synchronized int size() {
//这是一个线程安全的方法,返回集合元素的个数,成员变量elementCount
return elementCount;
}
//第四步操作
public synchronized void removeElementAt(int index) {
//其实,这个不用太关心了
modCount++;
//首先,我们删除一个元素的时候,会先判断是否存在这个元素的
//这里index=len-1就是数组空间的最后一个元素
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
//数组空间的起始位置是从0开始的,所以小于0,就需要抛出索引越界的问题
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
//确定j的位置,便于数组元素的移动
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
//集合元素个数减一
elementCount--;
//将移除的元素置为null,和下面注释表达的一样的,就是为了触发gc来回收不可达对象的
//以便整合内存空间
elementData[elementCount] = null; /* to let gc do its work */
}
2.5,peek()方法
public synchronized E peek() {
//获取集合元素个数
int len = size();
//集合个数长度为0时,再去获取元素时就应该抛出栈为空的异常
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
//第二步操作
public synchronized E elementAt(int index) {
//校验索引是否越界
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
//根据索引下标位置获取指定位置的元素
return elementData(index);
}
//第三步操作
E elementData(int index) {
return (E) elementData[index];
}
2.6,isEmpty()方法
public boolean empty() {
//判断集合size是否等于0
return size() == 0;
}
2.7,search()方法
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
//第二步操作
public synchronized int lastIndexOf(Object o) {
return lastIndexOf(o, elementCount-1);
}
//第三步操作
public synchronized int lastIndexOf(Object o, int index) {
//预检查机制
if (index >= elementCount)
throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
//其实,集合是可以装填null元素的,所以这里需要区分,时间复杂度为O(n)
if (o == null) {
for (int i = index; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = index; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
感谢各位的阅读,以上就是"如何实现Stack栈"的内容了,经过本文的学习后,相信大家对如何实现Stack栈这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
元素
方法
分析
就是
位置
个数
数据
数组
源码
结构
空间
篇文章
索引
学习
应用
内容
函数
场景
数据结构
特点
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
延庆区发展软件开发怎么样
苹果的网络安全设置
专业放心的语音会议软件开发
数据库怎么入门
电脑数据库在哪
数据库构建技术
软件开发是什么内容
网络安全从零学
家用监控网络安全性怎么样
不能在安全服务器玩csgo
软件开发及服务业
上海网络安全管理模式
csgo主播玩的什么服务器
邯郸博信软件开发公司怎么样
cisp信息安全和网络安全
java图片服务器框架
猫王互联网科技有限公司黄埔
台州专业网络安全准入控制公司
某图书销售数据库数据类型
云数据库开发者
网络技术发展实现了快速发展
2021网络安全宣传周征文题目
枣庄网络安全支队招聘
怎么随时监测服务器
用自己的服务器搭建局域网
中国互联网三大科技新巨头
导入mysql数据库的语句是
梅州卫星软件开发销售厂
如何监测学校网络安全
北京管理软件开发机构