JS 数据结构与算法 → 栈结构

目录

1、栈是个啥?

2、栈的常见操作

3、封装栈结构

4、栈的使用

5、栈结构的应用 — 十进制转二进制


1、栈是个啥?

栈(stack),它是一种受限的线性表,后进先出(LIFO — last in first out)。栈结构仅允许在表的一端进行插入和删除运算,这一端被称为栈顶,相对地,把另一端称为栈底。LIFO(last in first out)表示就是后进入的元素,第一个弹出栈空间,类似于自动餐托盘,最后放上的托盘,往往先把拿出去使用。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。示意图如下:

2、栈的常见操作

方法说明
push()添加一个新元素到栈顶位置
pop()移除栈顶的元素,同时返回被移除的元素
peek()返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)
isEmpty()如果栈里没有任何元素就返回true,否则返回false

size()

返回栈里的元素个数。这个方法和数组的length属性很类似
toString()将栈结构的内容以字符形式返回

3、封装栈结构

基于数组的方式实现栈结构,在封装的 Stack() 类的原型上添加栈的一些方法。

function Stack(){//封装栈类
    this.items = [];//栈中的属性
	
    //栈的相关操作
    //1.将元素压入栈
    //this.push = function(){}	这样是给每个对象实例添加一个方法,比较耗费内存
    Stack.prototype.push = function(element){	//这种方式更好,给原型添加方法,所有的对象实例都能继承	
        this.items.push(element);
    }
    //2.从栈中取出元素
    Stack.prototype.pop = function(){	
        return this.items.pop()
    }
    //3.查看一下栈顶的元素
    Stack.prototype.peek = function(){	
        return this.items[this.items.length -1]
    }
    //4.判断栈内是否为空
    Stack.prototype.isEmpty = function(){	
        return this.items.length == 0
    }
    //5,获取栈中元素个数
    Stack.prototype.size = function(){	
        return this.items.length
    }
    //6.toString方法
    Stack.prototype.toString = function(){	
        var resultString = '';
        for(var i in this.items){
            resultString += this.items[i] + '-'
        }
        return resultString;
    }
}

4、栈的使用

基于刚才封装的栈,进行一些栈的基本操作。

var stack = new Stack();//栈的使用
stack.push(111);
stack.push(110);
stack.peek();       //110
stack.pop();        //110
stack.isEmpty();    //false
alert(stack);       //111

5、栈结构的应用 — 十进制转二进制

现实生活中,我们主要使用十进制,但在计算机里的所有内容都是用二进制数字表示的(0和1),没有十进制和二进制相互转化的能力,与计算机交流就很困难。

(1)主要原理:如何实现十进制转二进制?要把十进制转化成二进制,可以将该十进制数字和2整除(二进制是满二进一),直到结果是0为止。将每一步的余数进栈,最后将栈中的内容其输出,输出的结果就是该十进制数对应的二进制数了。比如将一个十进制数 10,转化成对应的二进制数,其过程大概如下所示:

(2)代码实现

function dec2bin(numer) {       //封装十进制转二进制的函数
    var stack = new Stack();    //定义一个栈
    var remainder;              //定义一个变量保存余数

    // 循环除法
    while (numer > 0) {    
        remainder = numer % 2;          //获取每次除2后的余数
        numer = Math.floor(numer / 2);  //获取每次除2后的商(向下取整),赋值给number,作为下一次除法的被除数
        stack.push(remainder);          //将余数依次压栈
    }

    // 将数据取出
    var binaryString = "";        //定义一个容器,存放出栈元素
    while (!stack.isEmpty()) {    
        binaryString += stack.pop();    //将元素依次出栈
    }
    return binaryString;    //最后将所有出栈元素输出
}

// 测试函数
alert(dec2bin(10));    //1010
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值