Stack是一种后进先出(LIFO)的结构,其继承了Vector的基础上拓展5个方法push()、pop()、peek()、empty()、search()而来
1、push(E):将item推入到栈中
2、pop() :将栈中的最顶一个item推出,并返回被推出的item
3、peek():返回栈中最顶的一个item,但不对其做任何操作
4、empty():判断该栈是否为空
5、search(Object):搜索某一个item在该栈中的位置【位置为离栈顶最近的item与栈顶间距离】
PS:虽然Java有提供该类型的数据结构,但是官方推荐使用Deque【
双端队列】,Deque提供更好的完整性和一致性,应该优先使用。
Stack类源码:
public class Stack<E> extends Vector<E> {
/**
* Creates an empty Stack.
*/
public Stack() {
}
/**
* 将item推入到栈中
*/
public E push(E item) {
addElement(item);
return item;
}
/**
将栈中的最顶一个item推出,并返回被推出的item
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
/**
返回栈中最顶的一个item,但不对其做任何操作
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
/**
* 判断是否为空
*/
public boolean empty() {
return size() == 0;
}
/**
搜索某一个item在该栈中的位置【位置为离栈顶最近的item与栈顶间距离】
*/
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;
}
1、通过源码发现,Vector类在初始化的时候,会构造一个大小为10是空间
2、Stack中的pop、peek、search为线程安全类型
3、
- 时间复杂度:
- 索引: O(n)
- 搜索: O(n)
- 插入: O(1)
- 移除: O(1)
基本使用:
public class Test {
public static void main(String[] args){
Stack<String> stack = new Stack<>();
System.out.println("数量:"+stack.size());
stack.push("100");
stack.push("200");
stack.push("300");
for(int i = 0; i <stack.size(); i++){
System.out.println("stack值:"+stack.get(i));
}
System.out.println("数量:"+stack.size());
List<String> stack_list = stack.subList(0,2);
for(String str : stack_list){
System.out.println("stack_list截取值:"+str);
}
System.out.println("搜索100结果:"+stack.search("300"));
}
}
结果:
数量:0
stack值:100
stack值:200
stack值:300
数量:3
stack_list截取值:100
stack_list截取值:200
搜索100结果:1