栈的概念

​ 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

​ 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

​ 通俗来讲,栈就好像一个箱子,我们放东西时从箱子顶部放入(入栈),而最先放入的东西会被压到箱子底(栈底),顺序放入依次从箱子底往上排,最后的东西在箱子口(栈顶),需要拿东西的时候从箱子顶部依次拿(出栈),

​ 如图所示

示例

栈的创建

在原生JS对象中并没有栈这个结构的定义,所以要使用栈就要先创造它。。。

我们先声明一个栈的类,这里使用数组去存储栈内的元素

1
2
3
4
5
6
class Stack {
items
constructor() {
this.items = []
}
}

栈的数据结构需要一些必要的方法

如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// push(el)  添加一个新元素到栈顶(入栈)
// pop() 移除栈顶元素,同时返回被移除的元素(出栈)
// peek() 返回栈顶元素,不对栈做任何修改
// isEmpty() 判断栈是否为空,空返回true
// clear() 移除栈内所有元素
// size() 返回栈内元素个数
class Stack {
items
constructor() {
this.items = []
}
/**
* 入栈
* @param {*} el
*/
push(el) {
this.items.push(el)
}
/**
* 出栈
* @returns
*/
pop() {
return this.items.pop()
}
/**
* 获取栈顶元素
* @returns
*/
peek() {
return this.items[this.items.length - 1]
}
/**
* 判断是否为空
* @returns
*/
isEmpty() {
return this.items.length === 0
}
/**
* 清空栈元素
*/
clear() {
this.items = []
}
/**
* 获取栈内元素个数
* @returns
*/
size() {
return this.items.length
}
}

栈的使用

十进制转二进制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function divideBy2(n) {
// 使用new创建stack实例
let stack = new Stack()
// 二进制字符串
let binaryString = ''
while (n > 0) {
// 取模入栈
let rem = n % 2
stack.push(rem)
n = Math.floor(n / 2)
}
while (!stack.isEmpty()) {
// 逐个出栈加到结果字符串
binaryString += stack.pop()
}
return binaryString
}

本文参考自<学习JavaScript数据结构与算法>,以及百度百科。