基础概念
栈的概念: 栈是一种遵从后进先出原则的有序合集,添加新元素的一端称为栈顶,另一端为栈底。操作栈的元素时,只能从栈顶操作(添加、移除或取值)。
操作: 对于栈而言,只有两个操作,分别为入栈和出栈
- 入栈:Array.prototype.push()
- 出栈:Array.prototype.pop() // pop:在数组中删除最后一位元素
注意:
- 时间复杂度和空间复杂度都为O(1)
- 在JavaScript中可以通过数组实现栈的功能
- 所有满足后进先出的场景都可以考虑用栈数据结构
栈需要实现以下功能:
- push()入栈方法
- pop()出栈方法
- top()获取栈顶值
- size()获取栈的元素个数
- clear()清空栈
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//1. push()入栈方法
//2. pop()出栈方法
//3. top()获取栈顶值
//4. size()获取栈的元素个数
//5. clear()清空栈
class Stack {
constructor() {
// 存储栈的数据
this.data = []
// 记录栈的数据个数(相当于数组的length)
this.count = 0
}
//1. push()入栈方法
push(item) {
//方法一 数组方法push添加
// this.data.push(item)
//方法二 利用数组长度
// this.data[this.data.length] = item
//方法三 计数方式
this.data[this.count] = item
// 入栈后,count自增
this.count++
}
//2. pop()出栈方法
pop() {
// 出栈的前提是栈中存在元素,应先行检测
if(this.isEmpty()) { // 栈中数据为空
console.log('栈为空')
return
}
// 移除栈顶数据
// 方法一 数组方法pop移除
// return this.data.pop()
// 方法二 计数方式
const temp = this.data[this.count - 1] // temp:栈顶元素
delete this.data[--this.count] // count先减1(出栈后,栈中数量减少),this.data[count]代表栈顶元素,delete删除栈顶元素
// delete this.data[--this.count]相当于执行了下面两条命令
// delete this.data[this.count - 1]
// this.count--
return temp // 返回被删除的栈顶元素
}
// 检测栈是否为空
isEmpty() {
return this.count === 0
}
//3. top()获取栈顶值
top() {
if(this.isEmpty()) {
console.log('栈为空')
return
}
return this.data[this.count - 1]
}
//4. size()获取栈的元素个数
size() {
return this.count
}
//5. clear()清空栈
clear() {
this.data = []
this.count = 0
}
}
</script>
</body>
</html>