栈是一种后进先出的数据结构。在它之上,主要有三种操作:

(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类库中的实现相关推荐

  1. java栈顶元素_栈(Stack)

    栈(Stack)是一种后进先出的数据结构(LIFO:last in first out),只允许访问栈中的第一个数据项:即最后插入的数据项.移除这个数据项之后,才能看到第二个数据项,以此类推. 往栈中 ...

  2. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  3. java什么叫元素_什么是Java做什么 - 每个元素使它们成为对象类型?

    这个问题关于如何处理Java for-each循环中的元素.我有一个哈希表,它是一个LinkedLists数组. LinkedList节点的数据部分包含TableEntry,其中K和V是键和值类型. ...

  4. 【数据结构】栈详解——压栈/入栈 | 弹栈/出栈 | 获取栈顶元素

    栈 顺序栈 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈, ...

  5. 【C++】【数据结构】顺序栈的基本操作(初始化、入栈、出栈、取栈顶元素、遍历输出栈)的算法实现附全代码

    C++实现顺序栈的算法+步骤(附全代码): 使用c++完成数据结构顺序栈的基本操作,包括(初始化.入栈.出栈.取栈顶元素.遍历输出栈等),可直接编译运行. 顺序栈的定义如下: #define MAXS ...

  6. java栈和队列_栈和队列的面试题Java

    栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...

  7. C++栈的初始化,入栈,出栈,获取栈顶元素等操作

    栈的一些性质: 1.栈为空不可以出栈 2.栈顶元素先出 3.新元素插入栈顶 栈的初始化: #include<iostream> #include<string> using n ...

  8. Stack:删除并返回栈顶元素?

    在C++中,stack提供了删除栈顶元素的算法 stack<int>stk; stk.pop(); 但是有时候,我们希望在删除的同时能够知道这个栈顶元素是什么,而pop()是不能返回栈顶元 ...

  9. C语言实现栈的进栈与出栈、输出栈顶元素、元素个数、销毁栈

    /********************************引入头文件**************************************************/ #include&l ...

最新文章

  1. 【转】oracle存储过程常用技巧
  2. java中的daemon thread
  3. linux相对路径列出目录文件,linux – UNIX:列出目录中具有相对路径的文件
  4. Linux链接库三(C跟C++之间动态库的相互调用)
  5. unity鼠标控制镜头旋转_Unity Camera教程之 摄像机跟随鼠标移动而旋转
  6. jsp form提交到后台中文乱码_JSP与servlet之间的数据传递
  7. git为私有仓库设置密码_真香!在局域网下行云流水般使用git
  8. ats反向代理和重定向
  9. U-Time巡回完美收官 演讲嘉宾干货分享:数据篇
  10. Iterator迭代器遍历Map集合
  11. 形式语言与自动机理论 pdf_448页伊利诺伊大学算法图书【附PDF资料】
  12. UWB定位系统中为何要加入陀螺仪
  13. 企业征信(尽职调查):采集数据网站一览表
  14. 供应脂质体形成材料DSPE-PEG-Thiol,DSPE-PEG-SH
  15. 迪文串口屏幕通信问题
  16. 网络安全技术第八章——虚拟专用网络
  17. 下载m3u8视频及在Linux下将ts合并为mp4格式
  18. Android 拍照:如何使用已有相机应用捕获图片(Taking Photos Simply
  19. 为什么中国只有5%的景区暴利惊人?95%的景区却总是踩到陷阱!做文旅必须看懂此文!
  20. 全连接神经网络单层模型原理

热门文章

  1. 王道考研 计算机网络1 计算机网络概念,组成,功能和分类
  2. 为什么我喜欢单独编程
  3. 开源当自强:我们不是“便宜货”
  4. STL中map和string, vector 用法详解
  5. MPEG音视频编解码之MP3编解码概述
  6. JAVA 内存模型 (Java Memory Model,JMM)
  7. Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释
  8. 往对象数组里面添加相同的key 不同的value
  9. vue打包成app后,背景图片不显示
  10. SQL SERVER 2012 AlwaysOn - 维护篇 03