写一个java类,实现栈的功能
之前面试碰到这个题,自己实现栈的功能。
首先我们的了解栈的特点,和栈Stack.java各个方法的含义:
1、栈是单出入口的数据结构,即出口和入口是共用的。
2、栈拥有后进先出的特点。
栈Stack.java源码方法分析:
/**
* @author duke
* @dateTime 2018-07-19 22:24
* @description Stack源码,注意观察Stack继承了Vector类,基于list的实现
*/
public class Stack<E> extends Vector<E> {
/**
* 将item压入栈顶,功能和addElement等效
*/
public E push(E item) {
addElement(item);
return item;
}
/**
* 移除堆栈顶部的对象,并将该对象作为该函数的值返回。
* 或者解释为:返回Vector集合的最后一个元素
* @throws EmptyStackException 如果Stack为null则会抛出异常.
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
/**
* 获取堆栈顶部的对象,而不将其从堆栈中移除。
* 或者解释为:返回Vector集合的最后一个元素
* @throws EmptyStackException 如果Stack为null则会抛出异常.
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
/**
* stack是否为null.
*/
public boolean empty() {
return size() == 0;
}
/**
* 从栈顶开始寻找,查找当前项o到栈顶的距离。
* 栈顶元素距离栈顶的距离为1,其他的以此类推。
* 如果当前项o不在栈中,则返回-1.
*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
}
了解了Stack继承自Vector,基于list的实现;
了解了Stack各个方法的含义。
我们可以开始动工了,撸代码:
/**
* @author duke
* @dateTime 2018-07-19 22:24
* @description 去掉继承Vector,我们自己实现具体功能
*/
public class Stack<E> {
private volatile ArrayList<E> list = new ArrayList<>();
/**
* 将item压入栈顶,功能和addElement等效
*/
public E push(E item) {
list.add(item);
return item;
}
/**
* 移除堆栈顶部的对象,并将该对象作为该函数的值返回。
* 或者解释为:返回Vector集合的最后一个元素
*
* @throws EmptyStackException 如果Stack为null则会抛出异常.
*/
public synchronized E pop() {
E obj;
int len = list.size();
obj = peek();
list.remove(len - 1);
return obj;
}
/**
* 获取堆栈顶部的对象,而不将其从堆栈中移除。
* 或者解释为:返回Vector集合的最后一个元素
*
* @throws EmptyStackException 如果Stack为null则会抛出异常.
*/
public synchronized E peek() {
if (list.size() == 0) {
return null;
}
return list.get(list.size() - 1);
}
/**
* stack是否为null.
*/
public boolean empty() {
return list.size() == 0;
}
/**
* 从栈顶开始寻找,查找当前项o到栈顶的距离。
* 栈顶元素距离栈顶的距离为1,其他的以此类推。
* 如果当前项o不在栈中,则返回-1.
*/
public synchronized int search(Object o) {
int size = list.size();
int position = 1;
for (int i = size - 1; i >= 0; i--) {
if (o == list.get(i)) {
return position;
}
position++;
}
return -1;
}
}
最后才发现,其实没什么难度,去掉继承Vector,自己定义一个list实现对应的功能即可。
只好吐槽下,那些无聊的面试官。