数制转换(比如二进制转十进制,或者十进制转其他进制)通常可以使用栈来辅助完成,尤其是十进制转其他进制时。以下以十进制转二进制为例,解释如何利用栈进行数制转换,并提供相关的C语言代码。
十进制转二进制原理
将一个十进制数转换成二进制数,通常采用不断除以2取余数的方法。具体来说,每次将十进制数除以2,取余数(这个余数是二进制数的一位),然后将商继续除以2,直到商为0为止。最后,将每次得到的余数从低位到高位依次排列,即可得到该数的二进制表示。
使用栈辅助转换
由于我们需要从低位到高位依次排列余数,所以可以使用栈这种后进先出(LIFO)的数据结构来存储每次的余数。每次取余数后,先将余数压入栈中,最后再将栈中的元素依次弹出,即可得到正确的二进制序列。
C语言代码实现
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <stdbool.h> |
|
|
|
// 定义栈的最大容量 |
|
#define MAX_STACK_SIZE 100 |
|
|
|
// 定义栈的结构体 |
|
typedef struct { |
|
int top; |
|
int data[MAX_STACK_SIZE]; |
|
} Stack; |
|
|
|
// 初始化栈 |
|
void initStack(Stack *s) { |
|
s->top = -1; |
|
} |
|
|
|
// 判断栈是否为空 |
|
bool isEmpty(Stack *s) { |
|
return s->top == -1; |
|
} |
|
|
|
// 入栈操作 |
|
bool push(Stack *s, int value) { |
|
if (s->top >= MAX_STACK_SIZE - 1) { |
|
return false; // 栈满,无法入栈 |
|
} |
|
s->data[++s->top] = value; |
|
return true; |
|
} |
|
|
|
// 出栈操作 |
|
bool pop(Stack *s, int *value) { |
|
if (isEmpty(s)) { |
|
return false; // 栈空,无法出栈 |
|
} |
|
*value = s->data[s->top--]; |
|
return true; |
|
} |
|
|
|
// 十进制转二进制函数 |
|
void decimalToBinary(int decimal) { |
|
Stack s; |
|
initStack(&s); |
|
|
|
while (decimal > 0) { |
|
int remainder = decimal % 2; // 取余数 |
|
push(&s, remainder); // 将余数压入栈中 |
|
decimal /= 2; // 更新十进制数 |
|
} |
|
|
|
// 弹出栈中元素并打印,得到二进制数 |
|
printf("Binary: "); |
|
while (!isEmpty(&s)) { |
|
int value; |
|
pop(&s, &value); |
|
printf("%d", value); |
|
} |
|
printf("\n"); |
|
} |
|
|
|
int main() { |
|
int decimal; |
|
printf("Enter a decimal number: "); |
|
scanf("%d", &decimal); |
|
decimalToBinary(decimal); |
|
return 0; |
|
} |
代码解释
首先定义了一个栈的结构体Stack,包含了一个指向栈顶的top变量和一个用于存储元素的数组data。
initStack函数用于初始化栈,将栈顶指针设为-1。
isEmpty函数用于判断栈是否为空。
push和pop函数分别用于执行入栈和出栈操作。
decimalToBinary函数实现了十进制转二进制的逻辑。通过不断取余数并压入栈中,最后依次弹出栈中元素并打印,得到二进制数。
main函数中读取用户输入的十进制数,并调用decimalToBinary函数进行转换和打印。
运行这段代码,输入一个十进制数,程序会输出对应的二进制数。