什么是栈?
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(可以简单理解为一个水瓶)
栈的特点:后进先出(Last in First Out(LIFO))
封装栈
JavaScript中是没有提供栈这样的数据结构供我们使用,但是可以通过数组封装成一个栈,封装一个数据结构一般包含添加,删除,判断是否为空,判断数据数量,查找元素,清空数据,转换成字符串等方法。
以下是利用数组实现栈的封装:
//封装栈结构(受限的数组)
class Stack{
//#表示私有属性
#items = []
//push 添加一个元素到栈顶
push(data){
return this.#items.push(data)
}
//pop 出栈
pop(){
//弹出数组最后一个元素
return this.#items.pop()
}
//peek 返回栈顶(最后一个元素)
peek(){
return this.#items[this.#items.length - 1]
// return this.#items.at(-1)
}
//isEmpty
isEmpty(){
return this.#items.length === 0
}
//clear
clear(){
return this.#items = []
}
//size
size(){
return this.#items.length
}
//toString
toString(){
return this.#items.join("")
}
}
// const stack = new Stack()
// console.log(stack);
export default Stack
这里使用模块化语法,注意使用.mjs作为后缀名。
栈的应用场景
将十进制的数转换为二,八,十六进制的数
import Stack from "./Stack.mjs";
//利用栈结构计算十进制转换为2,8,16
const baseConversion = (decNumber,base) => {
//栈结构后进先出的特点
const stack = new Stack()
let string = ''
let number = decNumber
//用于判断16进制的ABCDEF
const baseString = '0123456789ABCDEF'
//使用短除法,将余数存入栈中
while(number>0){
stack.push(number%base)
//向下取整,保证结果准确
number = Math.floor(number/base)
}
//将结果,出栈
while(!(stack.isEmpty())){
// string += stack.pop()
string += baseString[stack.pop()]
}
return string
}
const result = baseConversion(50,2)
console.log(result);