栈结构-数组形式
栈是一种 "后进先出 (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
当然这里栈的简单建立是以数组形式的, 但我们也可以用对象形式的创建, 它在一些操作上的时间和空间复杂度是不一样的.
耐心和恒心, 总会获得回报的.