用顺序栈实现非负十进制到二进制、八进制、十六进制的转换算法(请用C语言且每一行代码都要有注释)
时间: 2024-12-20 11:15:20 浏览: 8
在C语言中,我们可以利用顺序栈来实现非负十进制数转换为二进制、八进制和十六进制的过程。这里假设我们已经有了一个栈结构以及一个函数`push`用于入栈和`pop`用于出栈操作。以下是简单的步骤:
```c
#include <stdio.h>
#include <stdlib.h> // 引入stdlib库,包含malloc和free
#include <string.h>
// 定义栈结构体
typedef struct {
int* stack; // 存储整数的数组
int top; // 栈顶指针
int capacity; // 栈的容量
} Stack;
// 初始化栈
void init(Stack* s) {
s->stack = (int*)malloc(sizeof(int) * s->capacity);
s->top = -1;
}
// 入栈操作
void push(Stack* s, int value) {
if (s->top == s->capacity - 1) {
// 扩容
s->capacity *= 2;
s->stack = (int*)realloc(s->stack, sizeof(int) * s->capacity);
}
s->stack[++s->top] = value;
}
// 出栈操作
int pop(Stack* s) {
return (s->top > -1) ? s->stack[s->top--] : -1; // 如果栈为空则返回-1
}
// 十进制转其他进制
void decimal_to_other(Stack* s, char* base) {
int dividend, remainder;
while (1) {
dividend = pop(s); // 取栈顶元素作为当前位值
if (dividend == -1) break; // 栈空,结束转换
printf("%c", base[dividend]); // 输出对应进制的字符
remainder = dividend % base[0]; // 计算余数(base表示每个位的最大数字)
push(s, remainder); // 将余数压回栈
}
}
int main() {
Stack decimalStack;
init(&decimalStack);
// 假设输入的十进制数为42
push(&decimalStack, 42);
printf("Decimal to Binary:\n");
decimal_to_other(&decimalStack, "01"); // 二进制的基数是2,'01'分别代表0和1
printf("\nDecimal to Octal:\n");
decimal_to_other(&decimalStack, "08"); // 八进制的基数是8,'08'分别代表0和8
printf("\nDecimal to Hexadecimal:\n");
decimal_to_other(&decimalStack, "16"); // 十六进制的基数是16,'16'分别代表0和A-F
free(decimalStack.stack); // 释放内存
return 0;
}
```
**
阅读全文