一、概述
在 Java 中 Stack 类表示后进先出(LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的
它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确
定到堆栈顶距离的 search 方法。
因为它继承自Vector,那么它的实现原理是以数组实现堆栈的。
二、继承关系
java.lang.Object 继承者 java.util.AbstractCollection<E> 继承者 java.util.AbstractList<E> 继承者 java.util.Vector<E> 继承者 java.util.Stack<E> 所有已实现的接口: Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
三、Stack 对 Vector 进行扩展的五个操作
四、源码分析
public class Stack<E> extends Vector<E> { /** * 创建一个空堆栈。 */ public Stack() { } /** * 把项压入堆栈顶部。其作用与下面的方法完全相同: * * item - 压入堆栈的项。 * * @return 返回 item 参数。 */ public E push(E item) { addElement(item);//是Vector中的方法,详细实现请查看Vector的源码 return item; } /** * 移除堆栈顶部的对象,并作为此函数的值返回该对象。 * * @return 堆栈顶部的对象( Vector 对象中的最后一项)。 * @throws EmptyStackException if this stack is empty. */ public synchronized E pop() {//注意此方法是 synchronized修饰的,同步方法 E obj; int len = size(); obj = peek(); removeElementAt(len - 1);//是Vector中的方法,详细实现请查看Vector的源码 return obj; } /** * 查看堆栈顶部的对象,但不从堆栈中移除它。 * */ public synchronized E peek() { int len = size(); if (len == 0) throw new EmptyStackException(); return elementAt(len - 1); } /** * Tests if this stack is empty. * * 测试堆栈是否为空。 为空返回 true */ public boolean empty() { return size() == 0; } /** * 返回对象在堆栈中的位置,以 1 为基数。如果对象 o是堆栈中的一个项, * 此方法返回距堆栈顶部最近的出现位置到堆栈顶部的距离; * 堆栈中最顶部项的距离为 1。使用 equals 方法比较 o 与堆栈中的项。 * * @param o the desired object. o - 目标对象。 * @return the 1-based position from the top of the stack where * the object is located; the return value <code>-1</code> * indicates that the object is not on the stack. * 返回 : 对象到堆栈顶部的位置,以 1 为基数;返回值 -1 表示此对象不在堆栈中。 */ public synchronized int search(Object o) {//注意此方法为 synchronized int i = lastIndexOf(o); if (i >= 0) { return size() - i; } return -1; } }
五、总结:
执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
执行pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。