JavaScript数据结构和算法----栈

前言 

  栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。可以想象桌上的一叠书,或者厨房里的堆放的盘子。

 

一、栈的创建

可以创建一个类来表示栈

//1、创建一种数据结构来保存栈里面的数据,这里选择数组
//2、声明一些栈的方法
    // push(element(s)) : 添加一个或一些元素到栈顶
    // pop() : 移除栈顶的元素,同时返回被移除的元素。
    // peek() : 返回栈顶的元素,仅仅是返回,不做任何修改。
    // isEmpty() : 如果栈里面没有任何元素就返回true,否者为false。
    // clear() : 清除栈里面的元素。
    // size() : 返回栈里面的个数。
function Stack(){
    
    var items = [];

    this.push = function(element){
        items.push(element);
    }

    this.pop = function(){
        return items.pop();
    }

    this.peek = function(){
        return items[items.length-1];
    }

    this.isEmpty = function(){
        return items.length == 0;
    }

    this.clear = function(){
        items = [];
    }

    this.size = function(){
        return items.length;
    }

    this.print = function(){
        console.log(items.toString());
    }

    
}


//使用栈

var stack = new Stack();

console.log(stack.isEmpty());//true

stack.push(100);

stack.push(200);

console.log(stack.isEmpty());//false

console.log(stack.size());//2

console.log(stack.peek());

stack.pop();

stack.print();//100

 

二、栈的应用

十进制转二进制

//算法描述:将该十进制的数和2整除,或者每次的余数(0或1),直到结果为0位置。比图10的二进制为:
    // 10/2 = 5 ,余数 0 
    // 5/2 = 2  ,余数 1
    // 2/2 = 1  ,余数 0
    // 1/2 = 0  ,余数 1
    // 10的二进制表示为:0101
 
function diviceBy2(decNumber){

    var remStack = new Stack(),
        rem,
        binaryString = '';

    while(decNumber > 0){
        rem = Math.floor(decNumber%2);
        remStack.push(rem);
        decNumber = Math.floor(decNumber/2);
    }

    while(!remStack.isEmpty()){
        binaryString += remStack.pop().toString(); 
    }

    return binaryString;
}
console.log(diviceBy2(10));   //1010
console.log(diviceBy2(520));  //1000001000
console.log(diviceBy2(1000)); //1111101000

 

十进制转成其他进制

function diviceByBase(decNumber, base){

    var remStack = new Stack(),
        rem,
        baseString = '',
        digits = '0123456789ABCDEF';//8进制是余数是(0-7)16进制是(0-9A-F)

    while(decNumber > 0){
        rem = Math.floor(decNumber % base);
        remStack.push(rem);
        decNumber = Math.floor(decNumber / base);
    }

    while(!remStack.isEmpty()){
        baseString += digits[remStack.pop()]; 
    }

    return baseString;
}

console.log(diviceByBase(100345, 2));  // 11000011111111001
console.log(diviceByBase(100345, 8));  // 303771
console.log(diviceByBase(100345, 16)); // 187F9

  

  

 

  

posted @ 2017-07-23 12:25  leaf+  阅读(179)  评论(0编辑  收藏  举报