1.啥是栈
2.栈的使用
3.栈的自定义实现
4.划分栈,虚拟机栈,栈帧概念
(1)首先咱们来介绍一下什么是栈
Stack就是栈:栈是一种元素先进后出的一种数据结构
你可以把它想象成羽毛球筒,这是最直观的了:你拿一个空的羽毛球筒,往里面放羽毛球,假设你放入3个羽毛球,当你想从里面取出一个羽毛球的时候,不就是取的是最后放进去的那个羽毛球吗?第一个放进去的羽毛球被压在了最底部,也是最后才能拿到的羽毛球~
如上图,我要放入1 2 3 4 5 6 这几个元素,我按顺序先放入1 放入 2 再放入 3,现在3就在栈顶,1在栈低,我要是想从栈里取元素,首先取到的栈顶元素,而我想取到1的话,就得把1上面的元素先全部取完才能取到1,这就是说栈是一种先进后出的数据结构,1先放进去了,那就最后才能取,3最后放进去的,那么3就优先被取到 ~
上述就是关于栈的概念介绍
(2)接下来看看怎么在java中去使用栈
(图片来源:比特高博)
上图给出了栈的方法
接下来用代码测试一下(讲解写在注释中)
public static void main(String[] args) {
//创建栈
Stack<Integer> stack = new Stack<>();
//往栈里插入元素
stack.push(1);
stack.push(21);
stack.push(13);
stack.push(15);
//获取栈顶元素
System.out.println(stack.peek());
//弹出栈顶元素
System.out.println(stack.pop());
//再次获取栈顶元素
System.out.println(stack.peek());
//判断此时栈是否为空
System.out.println(stack.empty());
//接下来把栈中剩下的元素再全部弹出
stack.pop();
stack.pop();
stack.pop();
//再次判断栈此时是否为空
System.out.println(stack.empty());
//该方法不是栈的方法,而是父类方法
System.out.println(stack.size());//stack继承了vector,有父类方法
}
注意两个方法
(1)peek():这个方法是查看当前的栈顶元素,返回值为栈的元素,这个只是看一下,并没有动元素
(2)pop():这个方法是弹出(删除)栈顶元素,返回值也是栈的元素,这个是不仅看,还把元素给删除了
然后还有最后那个size()方法,这个不是Stack自带的,而是它继承了vector,是父类的方法~
(3)自定义实现一个栈
栈的底层是一个数组,所以栈是顺序储存的
public class MyStack {
public int[] elem;
public int usedSize;
public static final int DEFAULT_CAPACITY = 10;
public MyStack(){
elem = new int[DEFAULT_CAPACITY];
}
public void push(int val){
if(isFull()){
elem = Arrays.copyOf(elem,elem.length*2);
}
elem[usedSize] = val;
usedSize++;
}
public boolean isFull(){
if(elem.length == usedSize) {
return true;
}else {
return false;
}
}
//删除栈顶元素
public int pop(){
if(empty()){
throw new emptyStackException("栈为空了");
}
int oldVal = elem[usedSize-1];
usedSize--;
return oldVal;
}
//判断是否为空
public boolean empty(){
return usedSize == 0;
}
public int peek(){
if(empty()){
throw new emptyStackException("栈为空了");
}
return elem[usedSize-1];
}
}
(4)区分栈,虚拟机栈,栈帧
栈:一种先进后出的数据结构
虚拟机栈:一块JVM内存,定义的局部变量,方法的开辟都存再虚拟机栈上
栈帧:但是方法的开辟出来的这块内存叫做栈帧
以上就是栈的简单介绍~