❓什么是栈
0️⃣栈的应用
在了解栈之前还是老样子,我们来看几个例子
这张图就是将子弹填装进弹夹相信大家都见过吧,虽然可能没在现实中见到,在很多影视剧中还是可以看到的,这个操作中,我们可以把弹夹看做一个栈,把子弹看做要压栈的数据,是不是很清晰明了。
在这里将子弹发射出去,就是进行的栈的弹出,也叫出栈。
1️⃣栈的定义
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
2️⃣栈的结构
栈就是一种可以看做是单向通道的线性结构,如上面的例子,弹夹就可以看作是一个栈,仅能从弹夹顶部进行装弹,也就是仅能从栈的一端进行数据的填充 也叫压栈,同样的道理,在出栈又叫弹栈的过程中也仅能从该方向弹出,手枪中的子弹在发射时,最后填装在弹夹顶部的子弹最早发射,而最早装填的子弹反而是在弹夹最底部,最后发射,即数据的弹栈和出栈也是先弹出栈顶最后压栈进来的数据。
画图技术比较菜,不过想表达的意思完全是表达清楚了。
💥栈的使用
这里主要是以Java为技术栈来梳理栈的使用方法的,只是使用的Java语言,但是无论什么语言对栈的结构都是不变的。
0️⃣栈的实例化
import java.util.Stack;
class Main{
public static void main(String[] args) {
Stack<Object> stack = new Stack<>();
}
}
这里实例化了一个栈对象,Java中本身就已经实现了栈,所以只需要导入java.util.Stack文件即可。
2️⃣栈的方法
方法名 | 返回值类型 | 方法体 | 描述 |
---|---|---|---|
empty | boolean | boolean empty() | 测试堆栈是否为空。为空则返回true |
peek | Object | Object peek( ) | 查看堆栈顶部的对象并返回,但不从堆栈中移除它。 |
pop | Object | Object pop( ) | 移除堆栈顶部的对象,并作为此函数的值返回该对象。 |
push | Object | Object push(Object element) | 把项压入堆栈顶部。 |
search | int | int search(Object element) | 返回对象在堆栈中的位置,以 1 为基数。 |
🎈光脚造轮子
要求:使用数组完成对栈的实现,以及几种方法的实现.
/*
* 使用数组完成栈的相关内容
* */
public class ArrayStack {
// 栈的大小
public int size;
// 存储的数据
public int[] data;
// 栈顶元素
public int top;
/*
* 构造方法
* */
public ArrayStack(int size){
this.size = size;
this.data = new int[size];
this.top = -1;
}
/*
* empty()方法
* */
public boolean empty(){
return (top == -1);
}
/*
* peek()方法
* */
public int peek(){
return data[top];
}
/*
* pop()方法
* */
public int pop(){
int ret = data[top];
top--;
return ret;
}
/*
* push()方法
* */
public boolean push(int num){
if(top < size) {
top++;
data[top] = num;
return true;
}
return false;
}
/*
* search()方法
* 以1为基数,从栈顶向栈底
* */
public int search(int target){
for(int i = top;i>=0;i--){
if(data[i] == target) {
return (top - i + 1);
}
}
// 返回-1代表没有
return -1;
}
掌握一个知识点的时候只要自己能重新实现一遍或者能讲给别人,即使有段时间没有进行使用,下次碰到的时候也会很快记忆,并且迅速能有思路的。反复几次,加深印象。
🎈练习题
源代码:https://gitee.com/ihaner/leetcode/tree/master/src/problem/leet155
源代码:https://gitee.com/ihaner/leetcode/tree/master/src/SwordFingerOffer/offer09
源代码:https://gitee.com/ihaner/leetcode/tree/master/src/problem/face0302