数据结构&算法:JS封装“栈”结构
一、数据结构:栈的介绍
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。栈的特点是:先进后出LIFO(last in first out),从栈顶放入元素的操作叫入栈,取出元素叫出栈。
二、JS封装实现一个栈
class Stack {
constructor(){
this.data=[]
}
get length(){
return this.data.length
}
get isEmpty(){
return this.data.length===0
}
clear(){
return this.data.length=0
}
//入栈
push(item){
this.data.push(item)
}
//出栈
pop(){
return this.data.pop();
}
//查看栈顶
peek(){
return this.data[this.data.length-1];
}
}
// 实例化并进行相关操作
const stack = new Stack()
console.log(stack.length) // 栈长度,打印结果 0
console.log(stack.isEmpty) // 是否空栈 打印结果 true
stack.push(1) // 将数字1压入栈中
stack.push(2) // 将数字2压入栈中
stack.push(3) // 将数字3压入栈中
console.log(stack.peek()) // 获取栈顶元素 打印结果 3
stack.pop() // 出栈
console.log(stack.length) // 栈长度,打印结果 2
console.log(stack.isEmpty) // 是否空栈 打印结果 false
stack.clear()
console.log(stack.length) // 栈长度,打印结果 0
console.log(stack.isEmpty) // 是否空栈 打印结果 true
2、返回栈中元素的最小值
分析:元素入栈后,要直接从栈中寻找最小值是很困难的,因为栈结构主要就是入栈、出栈两个核心操作,因此要获取最小值,可以通过新建一个数组存放。
可以在上面封装栈的基础上继承,增加一个存放最小值的数组以及获取最小值的方法。
// 继承上面封装的栈
class MinStack extends Stack {
constructor () {
super()
this.minData = [] // 存放栈中最小值
}
// 获取栈中最小元素
get minimum () {
return this.minData[this.minData.length - 1]
}
// 重写压栈push方法
push (item) {
let min = 0
if (this.data.length === 0) {
// 第一个元素进来时
min = item
} else {
// 否则,对栈顶元素和压入元素进行比较,小的进minData
const minimum = this.minimum
min = item <= minimum ? item : minimum
}
this.data.push(item)
this.minData.push(min)
}
// 重写出栈pop方法
pop () {
this.minData.pop()
return this.data.pop()
}
}
const stack = new MinStack()
stack.push(2)
stack.push(30)
stack.push(1)
stack.push(88)
console.log(stack.minimum) // 1
stack.pop()
stack.pop()
console.log(stack.minimum) // 2