Skip to content

Commit bfde8e5

Browse files
committed
chapter 4: stacks
1 parent 1fc5e95 commit bfde8e5

File tree

3 files changed

+132
-0
lines changed

3 files changed

+132
-0
lines changed
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// src/04-stack/03-base-converter-examples.ts
2+
3+
import decimalToBinary from './decimal-to-binary';
4+
import { decimalToBase, decimalToBase64 } from './decimal-to-base';
5+
6+
// Decimal to binary
7+
console.log(decimalToBinary(0)); // 0
8+
console.log(decimalToBinary(1)); // 1
9+
console.log(decimalToBinary(2)); // 10
10+
console.log(decimalToBinary(13)); // 1101
11+
console.log(decimalToBinary(233)); // 11101001
12+
console.log(decimalToBinary(10)); // 1010
13+
console.log(decimalToBinary(1000)); // 1111101000
14+
15+
// Decimal to base
16+
console.log(decimalToBase(100345, 2)); // 11000011111111001
17+
console.log(decimalToBase(100345, 8)); // 303771
18+
console.log(decimalToBase(100345, 16)); // 187F9
19+
console.log(decimalToBase(100345, 35)); // 2BW0
20+
21+
// Decimal to base 64
22+
console.log(decimalToBase64(100345, 64)); // Yf5=
23+
24+
// to see the output of this file use the command: npx ts-node src/04-stack/03-base-converter-examples.js

src/04-stack/decimal-to-base.ts

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// src/04-stack/decimal-to-base.js
2+
3+
import Stack from './stack';
4+
5+
/**
6+
* Converts a decimal number to a given base
7+
* @param {number} decimalNumber - decimal number to be converted
8+
* @param {number} base - base to convert the decimal number to
9+
* @returns {string} base representation of the decimal number
10+
*/
11+
function decimalToBase(decimalNumber: number, base : number) {
12+
13+
if (base < 2 || base > 36) {
14+
throw new Error('Base must be between 2 and 36');
15+
}
16+
17+
const digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Digits for base 36
18+
const remainderStack = new Stack<number>();
19+
let baseString = '';
20+
21+
while (decimalNumber > 0) {
22+
const remainder = Math.floor(decimalNumber % base);
23+
remainderStack.push(remainder);
24+
decimalNumber = Math.floor(decimalNumber / base);
25+
}
26+
27+
while (!remainderStack.isEmpty()) {
28+
baseString += digits[remainderStack.pop()]; // Use digit mapping
29+
}
30+
31+
return baseString;
32+
}
33+
34+
/**
35+
* Converts a decimal number to a given base
36+
* @param {number} decimalNumber - decimal number to be converted (between 2 and 36 or 64)
37+
* @param {number} base - base to convert the decimal number to
38+
* @returns {string} base representation of the decimal number
39+
*/
40+
function decimalToBase64(decimalNumber: number, base: number) {
41+
if (base < 2 || (base > 36 && base !== 64)) {
42+
throw new Error('Base must be between 2 and 36 or 64');
43+
}
44+
45+
const digits = base === 64 ?
46+
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' :
47+
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
48+
49+
const remainderStack = new Stack<number>();
50+
let baseString = '';
51+
52+
while (decimalNumber > 0) {
53+
const remainder = Math.floor(decimalNumber % base);
54+
remainderStack.push(remainder);
55+
decimalNumber = Math.floor(decimalNumber / base);
56+
}
57+
58+
while (!remainderStack.isEmpty()) {
59+
baseString += digits[remainderStack.pop()];
60+
}
61+
62+
// Handle padding for Base64 (if necessary)
63+
/* Base64 encodes data in groups of 3 bytes (24 bits).
64+
Each group is represented by four Base64 characters (6 bits per character).
65+
If the input data length isn't divisible by 3, padding characters (=) are added to the end of the output
66+
to ensure that the total length is a multiple of 4.
67+
This is important for proper decoding of the Base64 string back to its original data. */
68+
if (base === 64) {
69+
while (baseString.length % 4 !== 0) {
70+
baseString += '=';
71+
}
72+
}
73+
74+
return baseString;
75+
}
76+
77+
export { decimalToBase, decimalToBase64 };

src/04-stack/decimal-to-binary.ts

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// src/04-stack/decimal-to-binary.js
2+
3+
import Stack from './stack';
4+
5+
/**
6+
* Converts a decimal number to binary
7+
* @param {number} decimalNumber - decimal number to be converted
8+
* @returns {string} binary representation of the decimal number
9+
*/
10+
function decimalToBinary(decimalNumber: number) {
11+
const remainderStack = new Stack<number>();
12+
let binaryString = '';
13+
14+
if (decimalNumber === 0) {
15+
return '0';
16+
}
17+
18+
while (decimalNumber > 0) { // {1}
19+
const remainder = Math.floor(decimalNumber % 2); // {2}
20+
remainderStack.push(remainder); // {3}
21+
decimalNumber = Math.floor(decimalNumber / 2); // {4}
22+
}
23+
24+
while (!remainderStack.isEmpty()) { // {5}
25+
binaryString += remainderStack.pop().toString();
26+
}
27+
28+
return binaryString;
29+
}
30+
31+
export default decimalToBinary;

0 commit comments

Comments
 (0)