什么是栈结构
1、栈结构是一种线性结构,而且是受限的线性结构
栈结构的执行机制
观察上面的图片,我们可以将栈结构当做一个一头封死的玻璃圆管,而这个玻璃圆管的直径正好等于一个乒乓球的直径;一开始,玻璃圆管中什么都没有,空空如也,此时的玻璃管,也就是我们图中所说的空栈;
然后我和我的小伙伴准备去打乒乓球,于是我们去了楼下的小卖铺买了三个乒乓球,我们为了方便,把这三个乒乓球分别命名乒乓球1,乒乓球2,乒乓球3,并将它们按顺序装入了玻璃罐中,我们放入乒乓球的动作,就是栈结构的入栈
最后我们到了打乒乓球的地点,我们想要拿出其中的一个乒乓球,而这个拿的过程,我们在栈结构中我们就称之为出栈;
由于我们此时乒乓球之前是按照(乒乓球1,乒乓球2,乒乓球3的顺序放入其中的),那么此时我们想要拿一个乒乓球,且玻璃水管的直径正好是乒乓球的直径,所以我们不能用手随意的去抓取,那么只能依次取出,那么,首先取出的必定是最后放进去的乒乓球3,然后依次是乒乓球2、乒乓球1;
我们可以发现其中一个道理:最先放进去的乒乓球只能最后拿出来,反而最后放进去的乒乓球最先取出;
而这,正是栈结构的最大特性:先进后出,后进先出
而放球与拿球的动作,则称为入栈和出栈,而最上面的一个乒乓球,我们称之为栈顶;
而此时,我们有买来乒乓球4,此时我们想将他放在2和3之间,我们只能先取出乒乓球3,此时的2成为了栈顶,然后再放入乒乓球4,然后在放入3;而绝不可能在乒乓球2和3之间硬塞一个乒乓球4;也就意味着,我们在最上面的一个乒乓球,也是是栈顶上进行操作;要想中间插入,必须使被插入的地方成为栈顶;
其实可以理解为,栈结构,只能在栈顶进行操作;同样也可以理解,栈结构指适用于放入和取出,插入可以,但效率不高;
基于数组实现
栈结构基于数组实现,其实对于使用TS或JS的人员来说,还是比较容易实现的,它只不过是实现了前端数组中的某些方法
class Stack {
arr: number[];
// 定义栈中的属性
constructor() {
this.arr = []
}
// 栈的相关操作
// 压栈操作
push = (parms: number) => {
this.arr.push(parms)
}
// 出栈操作
pop = () => {
return this.arr.pop()
}
// 查看栈顶元素
checkStackTop = () => {
return this.arr[this.arr.length - 1]
}
// 判断栈是否为空
isEmpty = () => {
return this.arr.length === 0
}
// 取出栈中的元素个数
size = () => {
return this.arr.length
}
// 重写toString方式
toString = (params) => {
return this.arr.join(params)
}
}
// 栈的使用
let example = new Stack();
example.push(1);//[1]
example.push(2);//[1,2]
example.pop();//2
example.size();//1
这里,我使用class创建类的方式,为栈结构实现了栈结构必须有的压栈与弹栈的行为,还有一些辅助类的方式,例如查看栈中元素的个数,重写了一下toString方法