JavaScript数据结构——栈

  • 栈(stack),它是一种运算受限的线性表,后进先出(LIFO)

    • LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间. 类似于自动餐托盘, 最后放上的托盘, 往往先把拿出去使用.

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

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

    • 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

  • 生活中类似于栈的

    • 自助餐的托盘, 最新放上去的, 最先被客人拿走使用.

    • 收到很多的邮件(实体的), 从上往下依次处理这些邮件. (最新到的邮件, 最先处理)

    • 注意: 不允许改变邮件的次序, 比如从最小开始, 或者处于最紧急的邮件, 否则就不再是栈结构了. 而是队列或者优先级队列结构.

 我们使用JavaScript语言来封装一个栈

function Stack(){
            this.item=[]
            Stack.prototype.push=function(element){
                return this.item.push(element)
            }
            Stack.prototype.pop=function(){
                return this.item.pop()
            }
            Stack.prototype.peek=function(){
                return this.item[this.item.length-1]
            }
            Stack.prototype.isEmpty=function(){
                return this.item.length==0
            }
            Stack.prototype.size=function(){
                return this.item.length
            }
            Stack.prototype.toString=function(){
                this.item.join(" ")
            }
        }
  • 代码解析:

    • 我们创建了一个Stack构造函数, 用户创建栈的类.

    • 在构造函数中, 定义了一个变量, 这个变量可以用于保存当前栈对象中所有的元素.

    • 这个变量是一个数组类型. 我们之后无论是压栈操作还是出栈操作, 都是从数组中添加和删除元素.

    • 栈有一些相关的操作方法, 通常无论是什么语言, 操作都是比较类似的.

  • 栈的操作:

    • push(element): 添加一个新元素到栈顶位置。我们的实现是将最新的元素放在了数组的末尾, 那么数组末尾的元素就是我们的栈顶元素

    • pop():移除栈顶的元素,同时返回被移除的元素。出栈操作应该是将栈顶的元素删除, 并且返回

    • peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。和pop不同, peek仅仅的瞥一眼栈顶的元素, 并不需要将这个元素从栈顶弹出

    • isEmpty():如果栈里没有任何元素就返回true,否则返回false。直接判断数组中的元素个数是为0, 为0返回true, 否则返回false

    • size():返回栈里的元素个数。这个方法和数组的length属性很类似。直接获取数组的长度即可.(也可以使用链表作为栈的顶层实现)

栈的使用案例

        封装一个十进制转二进制的方法

function dec2bin(decnum) {
            var sta1 = new Stack()
            while (decnum > 0) {
                sta1.push(decnum % 2)
                decnum = Math.floor(decnum / 2)
            }
            var str = ""
            while (sta1.isEmpty() != true) {
                str += sta1.pop()
            }
            return str
        }

         测试代码

alert(dec2bin(10))
alert(dec2bin(233))
alert(dec2bin(1000))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值