這里需要借助 JavaScript 中 棧 這個數(shù)據(jù)結構,棧的相關知識如下圖:

棧
一、創(chuàng)建類[1]
首先需要創(chuàng)建一個 stack.js 文件來存儲 Stack(棧)類,如下代碼:
export default class Stack {
constructor() {
this.count = 0;
this.items = {};
}
push(element) {
this.items[this.count] = element;
this.count++;
}
pop() {
if (this.isEmpty()) {
return undefined;
}
this.count--;
const result = this.items[this.count];
delete this.items[this.count];
return result;
}
peek() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.count - 1];
}
isEmpty() {
return this.count === 0;
}
size() {
return this.count;
}
clear() {
this.items = {};
this.count = 0;
}
toString() {
if (this.isEmpty()) {
return '';
}
let objString = `${this.items[0]}`;
for (let i = 1; i < this.count; i++) {
objString = `${objString},${this.items[i]}`;
}
return objString;
}
}
二、十進制轉換成二進制[2]
我們來看看如何把十進制轉換成二進制?
看代碼中的注釋說明:
// decNumber 為傳入的十進制數(shù)
function decimalToBinary(decNumber) {
// 使用 stack.js 中 Stack 類
const remStack = new Stack();
let number = decNumber;
let rem;
let binaryString = '';
while (number > 0) {
// 獲得余數(shù)為2的數(shù)
rem = Math.floor(number % 2);
// 把2的余數(shù)放入棧中
remStack.push(rem);
// 把傳入的十進制數(shù)與2整除
number = Math.floor(number / 2);
}
while (!remStack.isEmpty()) {
// 用 pop 方法把棧中的元素都移除,再組成一個字符串
binaryString += remStack.pop().toString();
}
return binaryString;
}
// test
console.log(decimalToBinary(33)); //100001
console.log(decimalToBinary(100)); //1100100
注:為啥使用 Math.floor => javascript 中的數(shù)字類型不會區(qū)分數(shù)字是整數(shù)還是浮點數(shù)。
三、任意進制之間的轉換[3]
為了讓進制轉換更靈活,需要改動一下函數(shù),如下代碼:
// decNumber 為傳入的要轉換的十進制數(shù)字
// base: 要轉成的進制類型
function baseConverter(decNumber, base) {
// 創(chuàng)建 Stack 類
const remStack = new Stack();
// 定義一個進制位數(shù),這里設置了 36 位進制,可自定義位數(shù)
const digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let number = decNumber;
let rem;
let baseString = '';
if (!(base >= 2 && base <= 36)) {
return '';
}
while (number > 0) {
rem = Math.floor(number % base);
remStack.push(rem);
number = Math.floor(number / base);
}
while (!remStack.isEmpty()) {
// 對棧中的數(shù)字做轉化
baseString += digits[remStack.pop()];
}
return baseString;
}
// test
console.log(baseConverter(1314, 2)); //10100100010
console.log(baseConverter(1314, 8)); //2442
console.log(baseConverter(1314, 16)); //522
console.log(baseConverter(1314, 20)); //35E
console.log(baseConverter(1314, 30)); //1DO
console.log(baseConverter(1314, 35)); //12J