java栈顶元素_栈在Java类库中的实现
栈是一种后进先出的数据结构。在它之上,主要有三种操作:
(1)判断栈是否为空——empty();
(2)在栈顶添加一个元素——push(E);
(3)删除并返回栈顶元素——pop()。
在Java类库中,Stack类实现了栈,它继承自Vector类:
public class Stack extends Vector于是,Stack用数组保存元素:
protected Object[] elementData;用一个整数记录栈中元素的个数:
protected int elementCount;接下来看看栈的三种操作在Stack中是如何实现的。
1.
empty() 方法实现如下:
public boolean empty() {
return size() == 0;
}
size()方法是在Vector中定义的方法,具体定义如下:
public synchronized int size() {
return elementCount;
}
它返回栈中元素的个数,也就是说,如果栈中元素个数为0,栈就为空。
2.push(E element)方法实现如下:
public E push(E item) {
addElement(item);
return item;
}
它调用addElement(E)方法实现向栈中添加元素,addElement(E)方法实现如下:
public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
只需要关注方法的最后一行:
elementData[elementCount++] = obj;
它将元素添加到之前数组中已有元素的后面并把元素个数加1,这正是栈的push操作需要的。
3.pop()方法实现如下:public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
前面已经知道size()返回栈中元素的个数,于是len等于elementCount;peek()是Stack中的另一个方法,用于返回栈顶元素;removeElementAt(int)是Vector中定义的方法,删除指定位置元素。
peek()实现如下:
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
peek()方法又调用Vector中定义的方法elementAt(int)返回栈顶元素,elementAt(int)的实现如下:
public synchronized E elementAt(int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
return elementData(index);
}
elementAt(int)方法又调用elementData(int)方法,elementData(int)方法实现如下:
E elementData(int index) {
return (E) elementData[index];
}
原来,peek()方法实际上就是通过elementData[len-1]返回栈顶元素的。
接下来看removeElementAt(int)方法:
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
elementCount--;
elementData[elementCount] = null; /* to let gc do its work */
}
pop()中传给removeElementAt(int)的参数是len-1,
也就是elementCount-1,也就是说,removeElementAt(int)中的j=0,于是removeElementAt(int)方法直接执行到:
elementCount--;
elementData[elementCount] = null; /* to let gc do its work */这两行通过先把栈中元素数量减1,然后把之前的栈顶元素设置为null使之被垃圾收集器回收达到删除栈顶元素的目的。
java栈顶元素_栈在Java类库中的实现相关推荐
- java栈顶元素_栈(Stack)
栈(Stack)是一种后进先出的数据结构(LIFO:last in first out),只允许访问栈中的第一个数据项:即最后插入的数据项.移除这个数据项之后,才能看到第二个数据项,以此类推. 往栈中 ...
- java 取栈顶元素_《Java实战之内存模型》详解篇
内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...
- java什么叫元素_什么是Java做什么 - 每个元素使它们成为对象类型?
这个问题关于如何处理Java for-each循环中的元素.我有一个哈希表,它是一个LinkedLists数组. LinkedList节点的数据部分包含TableEntry,其中K和V是键和值类型. ...
- 【数据结构】栈详解——压栈/入栈 | 弹栈/出栈 | 获取栈顶元素
栈 顺序栈 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈, ...
- 【C++】【数据结构】顺序栈的基本操作(初始化、入栈、出栈、取栈顶元素、遍历输出栈)的算法实现附全代码
C++实现顺序栈的算法+步骤(附全代码): 使用c++完成数据结构顺序栈的基本操作,包括(初始化.入栈.出栈.取栈顶元素.遍历输出栈等),可直接编译运行. 顺序栈的定义如下: #define MAXS ...
- java栈和队列_栈和队列的面试题Java
栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...
- C++栈的初始化,入栈,出栈,获取栈顶元素等操作
栈的一些性质: 1.栈为空不可以出栈 2.栈顶元素先出 3.新元素插入栈顶 栈的初始化: #include<iostream> #include<string> using n ...
- Stack:删除并返回栈顶元素?
在C++中,stack提供了删除栈顶元素的算法 stack<int>stk; stk.pop(); 但是有时候,我们希望在删除的同时能够知道这个栈顶元素是什么,而pop()是不能返回栈顶元 ...
- C语言实现栈的进栈与出栈、输出栈顶元素、元素个数、销毁栈
/********************************引入头文件**************************************************/ #include&l ...
最新文章
- 【转】oracle存储过程常用技巧
- java中的daemon thread
- linux相对路径列出目录文件,linux – UNIX:列出目录中具有相对路径的文件
- Linux链接库三(C跟C++之间动态库的相互调用)
- unity鼠标控制镜头旋转_Unity Camera教程之 摄像机跟随鼠标移动而旋转
- jsp form提交到后台中文乱码_JSP与servlet之间的数据传递
- git为私有仓库设置密码_真香!在局域网下行云流水般使用git
- ats反向代理和重定向
- U-Time巡回完美收官 演讲嘉宾干货分享:数据篇
- Iterator迭代器遍历Map集合
- 形式语言与自动机理论 pdf_448页伊利诺伊大学算法图书【附PDF资料】
- UWB定位系统中为何要加入陀螺仪
- 企业征信(尽职调查):采集数据网站一览表
- 供应脂质体形成材料DSPE-PEG-Thiol,DSPE-PEG-SH
- 迪文串口屏幕通信问题
- 网络安全技术第八章——虚拟专用网络
- 下载m3u8视频及在Linux下将ts合并为mp4格式
- Android 拍照:如何使用已有相机应用捕获图片(Taking Photos Simply
- 为什么中国只有5%的景区暴利惊人?95%的景区却总是踩到陷阱!做文旅必须看懂此文!
- 全连接神经网络单层模型原理
热门文章
- 王道考研 计算机网络1 计算机网络概念,组成,功能和分类
- 为什么我喜欢单独编程
- 开源当自强:我们不是“便宜货”
- STL中map和string, vector 用法详解
- MPEG音视频编解码之MP3编解码概述
- JAVA 内存模型 (Java Memory Model,JMM)
- Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释
- 往对象数组里面添加相同的key 不同的value
- vue打包成app后,背景图片不显示
- SQL SERVER 2012 AlwaysOn - 维护篇 03