概念:表头进行插入和删除操作的线性表
核心思想:先进后出
作用:在编程语言的编译器和内存中保存变量、方法调用
操作方法:1)push() 进栈,即向栈里添加元素
2)pop() 出栈,即把元素从栈中删除
3)peak() 查询栈顶元素,即查询栈里最顶部那个元素(最后添加)
4)isEmpty() 判断栈是否为空
5)clear() 清空栈元素
6)size() 查询栈的大小,即栈内元素个数
应用场景:1)进制数的转换; 2)有效字符串的检验; 3)迷宫求解; 4)行编辑程序; 5)二叉树的遍历
栈的理解:可以把栈比作一个储物柜,进栈就是把物品放入储物柜,出栈即取出物品。像一般超市的寄存货柜,你把物品一个个的放进去(进栈),第一个放进去的在最里面,依次堆积,最后一个放进去的在最外面;取物品时候,开柜把商品一个个的取出来(出栈),首先取出的是最外面的一个商品(最后放进去的),然后依次往里,也就是说最后放进去的最先取出,最先放进去的最后取出,即是栈的先进后出的思想。
在实际的开发中,会使用栈的思想去操作数组
例1:js数组来模拟栈的操作
class Stack{
constructor(){
this.arr = [] // 定义一个数组代表栈
}
push(element){
this.arr.push(element) // 进栈
}
pop(){
return this.arr.pop() // 出栈
}
peak(){
return this.arr[this.arr.length-1] // 查看栈顶
}
isEmpty(){
return this.arr.length==0 // 查看栈是否为空
}
size(){
return this.arr.length // 查看栈元素个数
}
clear(){
this.arr = [] // 清空栈
}
getStack(){
return this.arr // 查看栈
}
}
例2:十进制转二进制
class DecimalToBinary{
constructor(n){
this.num = n
this.remainder = 0
}
setData(){
let s = new Stack() //调用上面的Stack类
while(this.num>0){
this.remainder = this.num%2; //去2的余数,即0或1
s.push(this.remainder);
this.num = Math.floor(this.num/2); //向下取整,如5÷2=2.5向下取整2
}
return s.getStack().join(''); //把十进制数组转成字符串输出
}
}
更多数据结构相关,请查看专栏:《JavaScript数据结构与算法》
(完)