步骤1、在对Stack进行分析前,先看看它是怎么使用的。
步骤2、通过提取源码Stack里面的代码来实现自定义的栈MyStack。
import java.util.EmptyStackException;
import java.util.Vector;
/**
* MyStack是一个后进先出(LIFO)栈,继承于Vector类;MyStack也是从
* 源码Stack.java中提取代码生成
* @param <E> 泛型
*/
public class MyStack<E> extends Vector<E>{
private static final long serialVersionUID = 1L;
/**
* 创建空栈
*/
public MyStack() {
}
/**
* 把item压入栈顶部。
* @param item 压入栈顶的元素.
* @return 返回item.
* @see java.util.Vector#addElement
*/
public E push(E item) {
addElement(item);//Vector里面的方法,会将压入栈的元素item存放在数组末尾
return item;
}
/**
* 查看栈顶的数据,返回值为栈顶元素,Vector数组中最后一个元素,同时把栈中的该元素删除
*
* @return 返回值为栈顶元素,Vector数组中最后一个元素
* @throws EmptyStackException 当MyStack为空时抛出异常.
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();//获取栈顶元素
removeElementAt(len - 1);//Vector中的方法,根据给的下标删除元素
return obj;
}
/**
* 查看栈顶的数据,返回值为栈顶元素,Vector数组中最后一个元素,但是不会删除该元素
* @return 返回值为栈顶元素,Vector数组中最后一个元素
* @throws EmptyStackException 当MyStack为空时抛出异常.
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);//Vector中的方法,在Vector数组末尾添加一个元素
}
/**
* 判断是否为空栈
* @return true 栈中没有元素时返回,false 栈中有元素
*/
public boolean empty() {
return size() == 0;
}
/**
* 搜索o在栈中距离栈顶最近的相同元素的距离
* @param o 要搜索的元素.
* @return 返回距离栈顶最近的相同元素的距离,以1为基准。如果栈中不存在这个元素,返回-1
*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
}
步骤 3、代码测试及运行结果:
从测试代码跟测试结果看,步骤3跟步骤1的不同之处就是在测试代码中创建栈的对象的类不一样,一个是Stack,一个是MyStack,其他完成相同。