概念
栈是一种后进先出的数据结构
- 其限制是仅允许在一端进行插入和删除。这一端被称为栈顶,另一端称为栈底;
- LFO( last in first out)后进入的元素第一个弹出栈空间;
- 向—个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
- 从—个栈删除元素又称作岀栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素;
实现
基于数组实现栈:
- push():添加一个新元素到栈顶
- pop():移除栈顶元素,返回被移除元素
- peek():返回栈顶的元素
- isEmpty():判断是否为空
- clear():清空栈
- get size:返回元素个数
class Stack {
constructor() {
this.items = []
}
// 添加一个新元素到栈顶
push(el) {
this.items.push(el)
}
// 移除栈顶元素,返回被移除元素
pop() {
return this.items.pop()
}
// 返回栈顶的元素
peek() {
const length = this.items.length
return length
? this.items[length - 1]
: undefined
}
// 判断是否为空
isEmpty() {
return this.items.length === 0
}
// 清空
clear() {
this.items = []
return true
}
// 返回元素个数
get size() {
return this.items.length
}
// toString
toString() {
let str = ''
for (let i = 0; i < this.items.length; i++) {
const el = this.items[i];
str += el + ' '
}
return str
}
}
实际应用
实现十进制转二进制?
思路:将十进制数字不断和2相除,保留余数,直到结果取整后为0。将得到的余数从后向前拼接组成二进制数据
// 十进制转二进制
function dec2bin(number) {
// 实例化栈
const stack = new Stack()
// 除2取整结果大于0时循环
while (number) {
// 余数放到栈中
stack.push(number% 2)
// 获取整除的结果
number= Math.floor(number/ 2)
}
// 从后向前拼接栈中数据
let binStr = ''
while (!stack.isEmpty()) {
binStr += stack.pop()
}
return binStr
}