数据结构(栈)

126 阅读2分钟

数据结构&算法: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