JavaScript数据结构之栈结构

终于开始数据结构的学习。。。拖延症要不得
上一次学习数据结构大约在大学时期,哦吼,完全应试学习,考完忘的干干净净。。。😰

📌数据结构:在计算机中,存储和组织数据的方式。

🌈常见的数据结构

- 数组 💙

- 栈 💚

- 链表 💙

- 图 💙

- 散列表 💙

- 队列 💙

- 树 💙

- 堆 💙

😊 这里先说栈结构

🌈栈结构

🔔 实际开发过程中,数组应该是最常使用的数据结构。那么我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据。但是有些时间,为了实现某些功能,必须对这种任意性加以限制。而栈和队列就是比较常见的受限的线性结构。都知道栈先进后、出队列先进先出的特点,这里先说栈结构。

🌈🌈栈 stack

🎄 是一种受限的线性表,先进后出(LIFO)

🎄 其限制是:允许在表的一端进行插入和删除运算。这一端称为栈顶,相对的,把另一端称为栈底

🎄 LIFO 即 last in first out 表示就是后进入的元素,第一个弹出栈空间。

🎄 向一个栈插入新元素又称作进栈、入栈或压栈,它就是把新元素放到栈顶元素的上面,使之成为新的栈顶元素

🎄 向一个栈删除元素又称作出栈或退栈,它就是把栈顶元素删掉,使之相邻的元素成为新的栈顶元素

🌈🌈函数调用栈

🎄 函数之间相互调用:A调用B,B中又调用C,C中又调用D.

🎄 那样在执行过程中,会先将A压入栈中,A没有执行完,所以不会弹出栈,

🎄 在A的执行过程中调用B,会把B压入栈中,这时候B在栈顶、A在栈底

🎄 如果这时候B可以执行完,那么B会弹出栈。但是B执行完了吗,没有,B又调用了C

🎄 所以C会压栈,并且在栈顶。而C又调用了D,D会压入栈顶。

🎄 所以当前的栈顺序是:栈底A->B->C->D栈顶

🎄 D执行完,弹出栈。C、B、A依次弹出。

🎄 所以我们有函数调用栈的称呼,就来自与它们内部的实现机制。(通过栈实现)
在这里插入图片描述

📝例题:

有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列?()

  • A. 5 4 3 6 1 2 √
  • B. 4 5 3 2 1 6 √
  • C. 3 4 6 5 2 1 × 在3、4出栈时,6必然是栈底,5是栈顶,6不可能在5之前出栈
  • D. 2 3 4 1 5 6 √

📌可以画图依次走一遍如下图A选项的流程
在这里插入图片描述

🌈🌈封装栈结构

这是使用基于数组的方式来实现

  • 栈的操作:
    • 🎄 push(element): 添加一个新元素到栈顶
    • 🎄 pop(): 删除栈顶元素,同时返回被移出的元素
    • 🎄 peek(): 返回栈顶元素,不对栈做任何修改
    • 🎄 isEmpty(): 如果栈里没有任何元素就返回true,否则返回false
    • 🎄 size():返回栈里的元素个数。这个方法和数组的length属性很类似
    • 🎄 toString(): 将栈结构的内容以字符串的形式返回
class Stack{
    constructor(){
        this.items = []
    }
     push(element){
        this.items.push(element)
     }
     pop(){
        return this.items.pop()
     }
     peek(){
        return this.items[this.items.length-1]
     }
     isEmpty(){
        return this.items.length === 0
     }
     size(){
        return this.items.length
     }
     toString(){
        return this.items.join(' ')
     }

}
//栈的使用
let s = new Stack()
    s.push(10);
    s.push(20);
    s.push(50);
    s.push(100);
    s.push(70);
 console.log(s);
 console.log(s.pop()); // 70
 console.log(s.peek()); //100
 console.log(s.isEmpty()); //false
 console.log(s.size()); //4
 console.log(s.toString());//10 20 50 100

🌈🌈栈的应用-十进制转二进制

 function dec2bin(decNumber) {
        let stack = new Stack()

        //因为不确定循环次数,因此这里用while来遍历获取 余数 和下一次运行的数字
        while(decNumber > 0){
            // 获取余数 推入栈中
            stack.push(decNumber%2)
            // 获取下一次运行的数字
            decNumber = Math.floor(decNumber/2)
        }
        let binaryString = ''
        while (!stack.isEmpty()){
            binaryString += stack.pop()
        }
        return binaryString
    }

    console.log(dec2bin(10))
    console.log(dec2bin(100))
    console.log(dec2bin(1000))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值