js进制转换
思想根据原生方法tostring()
栈(后进先出)
因为刚好有空看了一下数据结构和算法,书中写到栈的应用,就拿来学习了一下,
很简单的实现了一个栈
/**
* Stack 栈(后进先出)
*/
;(function(w){
let items = new WeakMap();
class Stack{
constructor(){
items.set(this,[]);
}
//追加
push(ele){
items.get(this).push(ele);
}
//删除
pop(){
let ele = items.get(this).pop();
return ele;
}
//读取最后一个元素
peek(){
return items.get(this)[this.items.length-1];
}
//清除
clear(){
items.set(this,[]);
}
//判断栈是否为空
isEntry(){
return items.get(this).length === 0;
}
}
//暴露类
w.Stack = Stack;
})(window)
其实以下的栈用数组代替也可以
10进制如何转其他进制呢
//全局变量
const stack = new Stack();
const binStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWSYZ';
Number.prototype.DECto = function(bin=10) {//如果没有传参默认是10转10进制
let remainder,result='',number = this;
if(!(bin>=2 && bin<=36)){//参数检验
throw new RangeError('DECto() radix argument must be between 2 and 36');
}
//入栈
while(number>0){
remainder = Math.floor(number % bin);
stack.push(remainder);
number = Math.floor(number/bin);
}
//出栈
while(!stack.isEntry()){
result += binStr[stack.pop()];
}
return result;
}
其他进制转10进制
//字符串类型添加2-36进制转10进制
String.prototype.toDEC = function(bin=10){
let remainder,number = this;
if(!(bin>=2 && bin<=36)){
throw new RangeError('DECto() radix argument must be between 2 and 36');
}
let binArr = binStr.slice(0,bin),//字符取值范围
sum = 0,//总值
length = number.length;//数的长度
for(let i=length-1; i>=0; i--){
let value = binStr.indexOf(number[i].toUpperCase());
sum += bin**(length-i-1)*value;//转10进制算法,(位数值*(进制数^(位数-1)))
}
return sum;
}
演示
10进制转其他
其他转10进制
其他进制转其他进制