JavaScript实现栈结构

什么是栈?

栈(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);

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
JavaScript中,和堆是用来存储变量和数据的两种不同的内存区域。 是一种后进先出(LIFO)的数据结构,用于存储基本类型的变量和引用类型的指针。当我们声明一个变量时,它的值会被直接存储在内存中。基本类型的值(如数字、布尔值、字符串等)被直接存储在中,而引用类型的变量则存储了指向堆内存中实际数据的指针。 堆是一种动态分配的内存区域,用于存储引用类型的数据。当我们创建一个引用类型的变量时,它的值实际上是一个指向堆内存中对象的引用。对象本身的数据存储在堆内存中,而中的变量只是存储了指向堆内存中对象的引用。 深拷贝是指创建一个新的对象,将原始对象的所有属性和嵌套对象的属性都复制到新对象中。这样,新对象和原始对象是完全独立的,对新对象的修改不会影响原始对象。在JavaScript中,可以使用不同的方法实现深拷贝,如使用JSON.parse(JSON.stringify(obj))或自定义递归函数来复制对象的属性和嵌套对象。 浅拷贝是指创建一个新的对象,将原始对象的属性复制到新对象中,但嵌套对象的引用仍然指向原始对象中的相同嵌套对象。这意味着对新对象的修改可能会影响原始对象。在JavaScript中,可以使用Object.assign()或展开运算符(...)来实现浅拷贝。 总结来说,用于存储基本类型的变量和引用类型的指针,而堆用于存储引用类型的数据。深拷贝是创建一个新对象并复制所有属性和嵌套对象的值,而浅拷贝只复制属性,嵌套对象的引用仍然指向原始对象。 #### 引用[.reference_title] - *1* *3* [JavaScript 中堆和的区别](https://blog.csdn.net/qq_29850249/article/details/110500006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JavaScript内存与堆内存分别是什么?](https://blog.csdn.net/qq_43807473/article/details/123816682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根号三;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值