// 栈是一种后进先出的数据结构
// 用数组来模拟他的结构
// [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