ใช้ **Stack (LIFO)** แปลงฐานเลข (Base Conversion) โดยหารซ้ำแล้วเก็บ Remainder — Pop ออกมาได้เลขในลำดับถูกต้อง
Algorithm: Repeated Division
Algorithm DecimalToBase(n, base):
Stack stack = new Stack()
while n > 0:
remainder = n % base
stack.Push(remainder)
n = n / base
result = ""
while stack not empty:
result += stack.Pop()
return result
ตัวอย่าง: Decimal → Binary (Base 2)
using System;
using System.Collections.Generic;
class Program {
static void Main() {
int number = 45;
int baseNum = 2; // Binary
var stack = new Stack();
int n = number;
if (n == 0) {
Console.WriteLine("0");
return;
}
while (n != 0) {
stack.Push(n % baseNum);
n /= baseNum;
}
Console.Write($"Decimal {number} to Base {baseNum}: ");
while (stack.Count > 0) {
Console.Write(stack.Pop());
}
Console.WriteLine();
// Output: 101101
Console.ReadKey();
}
}
Generic Base Converter Method
public static string ConvertToBase(int number, int baseNum) {
if (baseNum < 2 || baseNum > 36)
throw new ArgumentException("Base must be 2-36");
if (number == 0) return "0";
bool isNegative = number < 0;
if (isNegative) number = -number; // Handle Negative
var stack = new Stack();
const string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
while (number > 0) {
int remainder = number % baseNum;
stack.Push(digits[remainder]);
number /= baseNum;
}
char[] result = new char[stack.Count + (isNegative ? 1 : 0)];
int idx = 0;
if (isNegative) result[idx++] = '-';
while (stack.Count > 0) {
result[idx++] = stack.Pop();
}
return new string(result);
}
// Usage
Console.WriteLine(ConvertToBase(45, 2)); // 101101
Console.WriteLine(ConvertToBase(45, 8)); // 55
Console.WriteLine(ConvertToBase(45, 16)); // 2D
Console.WriteLine(ConvertToBase(255, 16)); // FF
Console.WriteLine(ConvertToBase(-45, 2)); // -101101
Built-in Alternatives (Simpler)
int n = 45;
Console.WriteLine(Convert.ToString(n, 2)); // "101101" (Base 2, 8, 10, 16 Only)
Console.WriteLine(Convert.ToString(n, 8)); // "55"
Console.WriteLine(Convert.ToString(n, 16)); // "2D"
// Custom Base: ใช้ Method ข้างต้น
Stack vs Recursion
| Approach | Pros | Cons |
|---|---|---|
| Stack (Iterative) | No Stack Overflow, Explicit Control | Manual Stack Management |
| Recursion | Concise, Natural | Stack Overflow Risk (Deep), Overhead |
สรุป
- Stack เหมาะสำหรับ Base Conversion เพราะ LIFO = Reverse Order ของ Remainders
- Generic Method รองรับ Base 2-36 (0-9, A-Z)
- Built-in
Convert.ToStringรองรับ Base 2, 8, 10, 16 เท่านั้น - จัดการ Negative Numbers และ Zero Case ให้ครบ