前言:计算机程序中,数据结构栈(堆栈)是什么?生活中,栈遍处都有,书堆呀、砖堆呀等等,基本上能看到堆起来的,都符合数据结构中堆栈的概念。如下图1、图2。
栈的定义:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈的操作规则:先进后出。
JDK 中栈的实现
那么我们来看看 java JDK 中栈是如何实现的?在 JDK(java8) 中,栈的实现类是 Stack(java.util.Stack),它的继承关系如下图所示:
其实现源码如下:
package java.util;
public class Stack<E> extends Vector<E> {
//创建一个空栈
public Stack() {
}
//入栈,添加元素,调用的是java.util.Vector#addElement方法
public E push(E item) {
addElement(item);
return item;
}
//出栈,移除栈顶元素,调用的是java.util.Vector#removeElementAt方法
public synchronized E pop() {
E obj;//栈顶元素
int len = size();//获取栈的长度
obj = peek();//获取当前栈顶元素
removeElementAt(len - 1);//移除栈顶元素
return obj;
}
//查找栈顶元素,调用 java.util.Vector#elementAt 的查询方法
public synchronized E peek() {
int len = size();//获取栈的长度
if (len == 0)//如果为空栈,抛出异常
throw new EmptyStackException();
return elementAt(len - 1);//查找栈顶元素
}
//判断栈是否为空
public boolean empty() {
return size() == 0;
}
/**
搜索在栈中的元素,调用的是java.util.Vector#lastIndexOf(java.lang.Object)
====又调用了===>java.util.Vector#lastIndexOf(java.lang.Object, int)方法
注意:返回对象在此堆栈上从1开始的位置,不是从0开始
**/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1224463164541339165L;
}
jdk下Stack(java.util.Stack),Java™ Platform Standard Ed. 8说明文档文档如下:
boolean |
empty() Tests if this stack is empty.//测试此堆栈是否为空。 |
E |
peek() Looks at the object at the top of this stack without removing it from the stack.//查看位于此堆栈顶部的对象,而不将其从堆栈中移除。 |
E |
pop() Removes the object at the top of this stack and returns that object as the value of this function.//移除此堆栈顶部的对象,并将该对象作为此函数的值返回。 |
E |
push(E item) Pushes an item onto the top of this stack.//将项目推送到堆栈顶部。 |
int |
search(Object o) Returns the 1-based position where an object is on this stack.//返回对象在此堆栈上从1开始的位置 |
使用场景:1)如android应用中activity就是栈的实现方式,当退出当前界面时,之前访问的界面就成为了栈顶的界面。2)浏览器中,页面的返回功能也是堆栈的实现。
小结:学习一种数据结构的时候,要对比出其与其他一些数据结构的不同,做到知其然并知其所以然。