一、什么是栈结构
栈(英语:stack)又称为堆栈或堆叠, 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。
由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈也称为后进先出表。
这里以羽毛球筒为例,羽毛球筒就是一个栈,刚开始羽毛球筒是空的,也就是空栈,然后我们一个一个放入羽毛球,也就是一个一个push进栈,当我们需要使用羽毛球的时候,从筒里面拿,也就是pop出栈,但是第一个拿到的羽毛球是我们最后放进去的。
二、用js数组实现栈结构
用js实现栈结构的方式有很多种,接下来介绍一下用数组实现的方式
1. 首先定义一个栈结构的类
class Stack {
constructor() {
this.stack = [];
}
}
很简单,一个栈结构的class就实现了。其中stack数组就是栈结构,用来存放数据
2. 数据入栈方法
数据进栈很像往数组里push一个元素,实现方式
put(item) {
this.stack.push(item);
}
3. 出栈
栈结构有个特点:先进后出
则对于出栈来说就是数组末尾删除一个元素,则对应的方法就是数组的pop方法
pop() {
return this.stack.pop();
}
4. 查看栈大小
返回数组的长度
size() {
return this.stack.length;
}
5. 查看栈顶元素
注意是查看,元素不需要出栈
peak() {
return this.stack[this.stack.length - 1];
}
6. 清空栈
clear() {
this.stack = [];
}
7. 完整代码
class Stack {
constructor() {
this.stack = [];
}
// 入栈
put(item) {
this.stack.push(item);
}
// 出栈
pop() {
return this.stack.pop();
}
// 栈大小
size() {
return this.stack.length;
}
// 查看栈顶元素
peak() {
return this.stack[this.stack.length - 1];
}
// 清空栈
clear() {
this.stack = [];
}
}
let stack = new Stack();
stack.put(1);
stack.put(2);
stack.put(3);
console.log(stack.size());
console.log(stack.peak());
console.log(stack.pop());
console.log(stack.peak());
console.log(stack.size());
三、 案例
十进制转二进制
整数转二进制采用"除2取余,逆序排列"法
假设我们现在需要将42转为二进制,那我们怎么做呢,如下图所示:
有没有发现这可以用栈结构实现
- 整数取余后入栈
- 用上一步取余的整数接着取余
- 当最后结果为0时停止入栈
- 元素依次出栈然后拼接成字符串输出
function dec2Bin(number) {
const stack = new Stack();
// 遍历
while (number > 0) {
// 取除二的余数
let remain = number % 2;
// 入栈
stack.put(remain);
// 进行下一次遍历
number = Math.floor(number / 2);
}
let string = "";
while (stack.size()) {
string += stack.pop();
}
console.log(string);
}
好了,栈结构就实现了。