一、概念
栈和队列,也是基于顺序表和链表实现的
栈是一种特殊的线性表,其只允许在固定的一段进行插入和删除元素操作。
遵循后进先出的原则
此处所见到的栈,本质上就是一个顺序表/链表,但是,实在顺序表/链表的基础上做出了限制
对栈来说禁止了顺序表/链表的各种增删改查,只支持三个操作:入栈、出栈、取栈顶元素
因此我们可以认为,栈就是只支持尾插、尾删、获取尾部元素的顺序表/链表
栈虽然在功能上做出了限制,但是他却是能在特定场景下,解决特定问题的特定手段
*顺序表链表这样的结构,功能太丰富了,容易出错;栈/队列针对特定的场景,对顺序表链表做出了限制,从而大大降低了出错的概率
二、栈的一些操作
package stack;import java.util.Stack;public class test1 {public static void main(String[] args) {//使用 标准库的栈Stack<String> stack = new Stack<>();//入栈操作stack.push("aaa");stack.push("bbb");stack.push("ccc");//取栈顶元素,知识查看一下栈顶的元素内容,不会把整个元素出栈String top = stack.peek();System.out.println(top);//出栈,返回当前出栈的元素的内容String str = stack.pop();System.out.println(str);}}
三、Stack基本功能的实现
package stack;//模拟实现一个栈
//可以基于顺序表(数组)实现,也可以基于链表来实现
//基于数组更加简单public class MyStack {private String[] arr;private int size =0;public MyStack(){arr = new String[1000];size =0;}public MyStack(int capacity){arr = new String[capacity];size = 0;}public void resize(){//1.创建一个更长的数组String[] newArr = new String[arr.length*2];//2.把原来数组的元素复制到新数组for (int i =0;i<arr.length;i++){newArr[i] = arr[i];}//3.把新数组赋值给原数组arr = newArr;}//入栈public void push(String elem){//如果空间不够了我们要实现扩容操作if(size == arr.length){resize();}//实现一个尾插操作arr[size]= elem;size++;}//出栈public String pop(){//考虑特殊情况if(size ==0){throw new RuntimeException("Stack is empty!");}String str = arr[size-1];//不要忘了把元素个数减去一个size--;return str;}//获取栈顶元素public String peek(){if(size == 0 ){throw new RuntimeException("Stack is empty!");}String elem = arr[size-1];return elem;//这里跟上面出栈的不同就是这里的元素个数不要--}}