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 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内存,定义的局部变量,方法的开辟都存再虚拟机栈上
栈帧:但是方法的开辟出来的这块内存叫做栈帧
以上就是栈的简单介绍~