栈-Stack源码解析
一、Stack 栈特点:后进先出(LIFO -> last-in-fisrt-out)继承:Vector,底层使用动态数组实现二、API1、压栈
·
一、Stack 栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。Stack将底层数组的尾部看作栈顶。
特点:后进先出(LIFO -> last-in-fisrt-out)、线程安全
继承:Vector,底层使用动态数组实现,新增5个API
二、API
1、压栈:在栈顶插入元素,调用Vector.addElement追加元素
public E push(E item) {
// 数组末尾增加元素
addElement(item);
// 返回插入的元素,即栈顶元素
return item;
}
2、出栈:栈顶出栈,移除栈顶元素并返回,调用Vector.removeElementAt移除末尾元素,栈空时抛出异常EmptyStackException,使用syschronized保证线程安全
public synchronized E pop() {
E obj;
// 获取底层数组长度,即栈内元素数量
int len = size();
// 调用自身peek()方法,获取栈顶元素
obj = peek();
// 出栈,移除栈顶,即底层数组末尾元素
removeElementAt(len - 1);
// 返回出栈元素
return obj;
}
3、查看栈顶元素,不移除,调用Vector.elementAt获取末尾元素,栈空时抛出异常EmptyStackException,使用syschronized保证线程安全
public synchronized E peek() {
// 获取底层数组长度,即栈内元素数量
int len = size();
// 栈空时抛出异常
if (len == 0)
throw new EmptyStackException();
// 返回栈顶元素
return elementAt(len - 1);
}
4、判断是否栈空
public boolean empty() {
return size() == 0;
}
5、查找栈中是否包含某元素,存在则返回从栈顶开始计数的位置,即Vector中倒数位置;不存在则返回-1,使用syschronized保证线程安全
public synchronized int search(Object o) {
// 底层数组中从后往前查找元素,并返回下标,不存在时返回-1
int i = lastIndexOf(o);
// 元素存在时返回倒数位置
if (i >= 0) {
return size() - i;
}
// 元素不存在时返回-1
return -1;
}
更多推荐
已为社区贡献2条内容
所有评论(0)