栈结构-数组形式

栈是一种 "后进先出 (LIFO)" 的线性结构, 特点是只有一个出口. 对于新增或者待删除的元素都保存在栈的同一端, 成为 "栈顶". 另一端则就是 "栈底" 了. 新加的元素靠近栈顶, 旧元素靠近栈顶.

就好比一口深井管道, 上面的出口是栈顶, 底部是栈底. 先掉下来兄弟, 沉得愈深, 后掉下来的兄弟则愈接近栈顶, 能被优先带粗去.

那这种结构有什么用的, 列举几种最常见的场景:

  • 内存中的变量保存, 方法调用, 表达式求值
  • 浏览器历史记录回退, 用户操作撤回
  • 编程语言的编辑器符号对称验证
  • 递归算法的计算过程
  • 进制转换等

反正就是很多啦, 在 javascript 语言中, 我们可以先用数组作为底层结构来模拟栈这样的数据结构, 当然用对象也是可以的.

class Stack {
  constructor() {
    this.arr = []
  }
}

然后要为栈声明一些常用的方法.

  • push (items) : 添加一或多个元素到栈顶
  • pop ( ) : 移除并返回栈顶元素
  • peek ( ) : 返回栈顶元素, 不做其他任何操作
  • clear ( ) : 移除栈里所有元素
  • size ( ) : 返回栈里元素个数, 类似 arr.length
  • isEmpty ( ) : 如果栈里无元素返回 true, 否则返回 false

向栈顶添加元素 push

元素入栈, 直接通过底层的数组的 push 方法, 尾部添加元素即可.

class Stack {
  constructor() {
    this.arr = []
  }
  // 入栈
  push(item) {
    this.arr.push(item)
  }
}

从栈顶移除元素 pop

元素出栈, 直接通过底层的数组的 pop 方法, 尾部删除元素即可.

class Stack {
  constructor() {
    this.arr = []
  }
  // 出栈
  pop() {
    return this.arr.pop()
  }
}

查看栈顶元素

即返回底层数组的最后一个元素即可, 可通过数组索引实现.

class Stack {
  constructor() {
    this.arr = []
  }
  // 查看栈顶元素
  peek() {
    return this.arr[this.arr.length - 1]
  }
}

检查栈是否为空

即判断底层数组的 length 属性的值, 顺便再实现一下 size 方法, 本质是同一个东西.

class Stack {
  constructor() {
    this.arr = []
  }
  // 是否为空
  isEmpty() {
    return this.arr.length == 0
  }
  // 栈的元素个数或长度
  size() {
    return this.arr.length
  }
}

清空栈元素

简单粗暴的方法就是让底层数组指向一个 [ ] 即可, 当然也可以不断调用 pop 来移除所有元素.

class Stack {
  constructor() {
    this.arr = []
  }
  // 清空栈
  clear() {
    this.arr = []
  }
}

至次, 一个栈的数据结构我们就实现了!

// stack_array.js 

class Stack {
  constructor() {
    this.arr = []
  }
  // 入栈
  push(item) {
    this.arr.push(item)
  }
  // 出栈
  pop() {
    return this.arr.pop()
  }
  // 查看栈顶元素
  peek() {
    return this.arr[this.arr.length - 1]
  }
  // 是否为空
  isEmpty() {
    return this.arr.length == 0
  }
  // 栈的元素个数或长度
  size() {
    return this.arr.length
  }
  // 清空栈
  clear() {
    this.arr = []
  }
}

简单使用栈

const stack = new Stack()

console.log('栈是否为空: ', stack.isEmpty());
// 入栈
stack.push(1)
stack.push(2)
stack.push('youge')

console.log('栈顶元素是: ', stack.peek());

console.log('栈的长度是: ', stack.size());
console.log('栈是否为空: ', stack.isEmpty());

stack.push(666)
stack.push(888)
console.log('正在移除栈顶元素是: ', stack.pop());
console.log('正在移除栈顶元素是: ', stack.pop());

PS F:\algorithms> node .\stack_array.js
栈是否为空:  true
栈顶元素是:  youge
栈的长度是:  3
栈是否为空:  false
正在移除栈顶元素是:  888
正在移除栈顶元素是:  666

当然这里栈的简单建立是以数组形式的, 但我们也可以用对象形式的创建, 它在一些操作上的时间和空间复杂度是不一样的.

posted @ 2024-03-27 20:17  致于数据科学家的小陈  阅读(7)  评论(0编辑  收藏  举报