如何实现Stack栈
发表于:2024-10-17 作者:千家信息网编辑
千家信息网最后更新 2024年10月17日,这篇文章主要讲解了"如何实现Stack栈",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何实现Stack栈"吧!一,Stack源码分析Stack,栈,
千家信息网最后更新 2024年10月17日如何实现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安全错误
数据库的锁怎样保障安全
软件开发参与人员
软件开发项目未立项风险
服务器接口安全检测
镇网络安全应急演练
小学学校网络安全标语大全
九台区通用网络技术咨询售后服务
遵化服务器最近的口是哪里
cp_id数据库
xmind连接服务器是什么意思
网络技术基础拓扑结构
仙凡幻想云梦生花服务器
怎么查服务器域名
烟台服务器
国外数据库运维形考答案
msf数据库密码
数据库索引图片
乐亭海航软件开发创造辉煌
中国短视频软件开发公司排名
学校软件开发系统裤
网络没连接上苹果服务器
软件开发师怎么入行
无线网络技术怎么学
nginx下载服务器配置
网络安全与数据分离
网络安全登记保护制度的主要内容
战争中怎样使用虚拟网络技术
软件开发行业发展方向
怎样弄代理服务器
数据库创建表添加说明
吉林省首选dns服务器云空间