Stack的底层存储结构是数组,Stack的进出方式是后进先出,Stack实现了List接口。
一、Stack的创建
Stack只有无参构造一种构造方法
Stack<Integer> stack=new Stack<>();
二、Stack的常用方法
Stack的常用方法都具有Stack的特色
(1)入栈(尾插)
//已经创建一个Stack<Integer>实例stack
stack.push(10);//向栈中压入一个数据10
(2)出栈(尾删)
//已经创建一个Stack<Integer>实例stack
stack.pop();//将栈顶元素出栈
(3) 获取栈顶元素
//已经创建一个Stack<Integer>实例stack
int a=stack.peek();//获取到栈顶的元素
(4)获取栈内元素个数和判断栈是否为空
//已经创建一个Stack<Integer>实例stack
stack.size()//获取到栈内元素个数
stack.empty()//判断栈是否为空,空则返回true,非空返回true
值得一提的是,List和Collection接口中都定义的isEmpty()方法来判断栈是否为空,栈使用的是empty()方法;
三、Stack的应用
(1)将递归变为循环
如:逆序打印链表
// 递归方式
void printList(Node head){
if(null != head){
printList(head.next);
System.out.print(head.val + " ");
}
}
// 循环方式
void printList(Node head){
if(null == head){
return;
}
Stack<Node> s = new Stack<>();
// 将链表中的结点保存在栈中
Node cur = head;
while(null != cur){
s.push(cur);
cur = cur.next;
}
四、栈,虚拟机栈,栈帧有什么区别
栈是一个数据结构
虚拟机栈是一个jvm的一块内存
栈帧是函数调用的时候java虚拟机栈上创建的一块内存