一、概念
栈和队列,也是基于顺序表和链表实现的
栈是一种特殊的线性表,其只允许在固定的一段进行插入和删除元素操作。
遵循后进先出的原则
此处所见到的栈,本质上就是一个顺序表/链表,但是,实在顺序表/链表的基础上做出了限制
对栈来说禁止了顺序表/链表的各种增删改查,只支持三个操作:入栈、出栈、取栈顶元素
因此我们可以认为,栈就是只支持尾插、尾删、获取尾部元素的顺序表/链表
栈虽然在功能上做出了限制,但是他却是能在特定场景下,解决特定问题的特定手段
*顺序表链表这样的结构,功能太丰富了,容易出错;栈/队列针对特定的场景,对顺序表链表做出了限制,从而大大降低了出错的概率
二、栈的一些操作
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;
//这里跟上面出栈的不同就是这里的元素个数不要--
}
}