如何用C语言编写一个通用函数,利用栈数据结构实现二进制、十进制、八进制和十六进制数之间的互相转换?
时间: 2024-10-22 20:23:39 浏览: 40
C语言-顺序栈实现十进制转换为二进制-八进制-十六进制
在C语言中,我们可以创建一个通用函数来实现不同进制间的转换,这通常通过栈来辅助处理。下面是一个简单的示例,展示了如何使用栈来存储数字的每一位,并根据输入的进制进行相应的操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 助手函数,将一个字符转成对应的数值(0-9或A-F)
int char_to_digit(char c, int base) {
if (base == 16 && '0' <= c && c <= '9') return c - '0';
if (base == 16 && ('A' <= c && c <= 'F')) return c - 'A' + 10;
if (base == 8 && '0' <= c && c <= '7') return c - '0';
return c - '0'; // 默认为十进制
}
// 栈结构体和相关操作
typedef struct {
int data[100]; // 足够大的数组来存储数字
size_t top; // 栈顶指针
} Stack;
void push(Stack *s, int value) {
s->data[s->top++] = value;
}
int pop(Stack *s) {
return s->data[--s->top];
}
// 进制转换通用函数
void convert(int num, const char *input_base, char *output_base, Stack *stack) {
size_t i = strlen(input_base);
for (; i > 0; i--) {
int digit = char_to_digit(input_base[i - 1], atoi(input_base));
push(stack, digit);
}
while (!stack->top == 0) {
printf("%d", pop(stack)); // 可在此处加入相应的进制输出
if (output_base != NULL) {
switch (*output_base++) {
case 'b':
printf(" %o", pop(stack));
break;
case 'd':
printf(" %d", pop(stack));
break;
case 'o':
printf(" %o", pop(stack));
break;
case 'x':
printf(" %X", pop(stack));
break;
}
}
}
}
// 测试函数
int main() {
Stack stack;
stack.top = 0;
// 示例:将十进制的12345转换为二进制、八进制和十六进制
convert(12345, "10", "box", &stack);
return 0;
}
```
这个例子中,`convert`函数接受一个十进制整数,输入和输出的进制字符串以及一个栈作为参数。首先,它将输入数字的每一位从高位到低位压入栈中,然后不断取出栈顶元素并根据指定的输出进制格式打印出来。
注意这是一个基础实现,实际项目中可能需要考虑更多边界情况和错误处理。此外,上述代码并没有返回值,如果需要直接返回结果,可以添加相应修改。
阅读全文