SOURCE

// 栈是一种后进先出的数据结构
// 用数组来模拟他的结构
// [1,2,3,4,5,6]
// [栈底,,,,栈顶]
// 栈常见的操作
// 1,栈顶添加元素 push
// 2,栈顶移除元素 pop
// 3,查看栈顶 peek
// 4,检查栈是否为空 isEmpty
// 5,移除全部元素 clear
// 6,获取栈的长度 size
// 7,打印栈内全部元素 point

function Stack (){
    let items = [] // 定义一个栈,这里不用成员属性this.items = [] 是不想让外部访问

    // 1,栈顶添加元素 push
    this.push = function(element){
        items.push(element)
    }
    // 2,栈顶移除元素 pop
    this.pop = function(){
        return items.pop()
    }
    // 3,查看栈顶 peek
    this.peek = function(){
        return items[items.length - 1]
    }
    // 4,检查栈是否为空 isEmpty
    this.isEmpty = function(){
        return items.length === 0
    }
    // 5,移除全部元素 clear
    this.clear = function(){
        items = []
    }
    // 6,获取栈的长度 size
    this.size = function(){
        return items.length
    }
    // 7,打印栈内全部元素 point
    this.print = function(){
        console.log(items)
    }
}

let stack = new Stack();
console.log(stack.isEmpty()); // true

stack.push(5);
stack.push(8);
console.log(stack.peek()); // 8

stack.push(11);
console.log(stack.size()); // 3
console.log(stack.isEmpty()); // false

stack.push(15);
stack.pop();
stack.pop();
console.log(stack.size()); // 2
stack.print(); // 5,8

stack.clear();
stack.print(); // 

// 进制转换算法
//   将十进制数字10转换成二进制数字,过程大致如下:

//   10 / 2 = 5,余数为0

//   5 / 2 = 2,余数为1

//   2 / 2 = 1,余数为0

//   1 / 2 = 0, 余数为1

//   我们将上述每一步的余数颠倒顺序排列起来,就得到转换之后的结果:1010。

//   按照这个逻辑,我们实现下面的算法:
function tenTotwo(tenNumber){
    let stack = new Stack()
    let divider = tenNumber
    let result = ''
    while(divider > 0){
        stack.push(divider % 2)
        divider = Math.floor(divider / 2) 
    }
    while(!stack.isEmpty()){
        result = result + stack.pop()
    }
    return result
}
console.log(tenTotwo(233)); // 11101001
console.log(tenTotwo(10)); // 1010
console.log(tenTotwo(1000)); // 1111101000

// 如何以最小的改动实现十进制转任何进制
function baseConverter(tenNumber, base){
    let stack = new Stack()
    let divider = tenNumber
    let result = ''
    let digits = '0123456789ABCDEF';
    while(divider > 0){
        stack.push(divider % base)
        divider = Math.floor(divider / base) 
    }
    while(!stack.isEmpty()){
        result = result +digits[stack.pop()]
    }
    return result
}
console.log(baseConverter(233, 2)); // 11101001
console.log(baseConverter(10, 2)); // 1010
console.log(baseConverter(1000, 2)); // 1111101000

console.log(baseConverter(233, 8)); // 351
console.log(baseConverter(10, 8)); // 12
console.log(baseConverter(1000, 8)); // 1750

console.log(baseConverter(233, 16)); // E9
console.log(baseConverter(10, 16)); // A
console.log(baseConverter(1000, 16)); // 3E8
console 命令行工具 X clear

                    
>
console