用C语言的栈进制间的转换演示。实现包括二进制、八进制、十进制、十六进制的相互转换。并带有代码注释
时间: 2023-07-10 12:26:16 浏览: 97
C语言-顺序栈实现十进制转换为二进制-八进制-十六进制
好的,以下是用C语言实现进制间转换的示例代码,代码中有注释,希望对您有所帮助。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义栈结构
struct stack {
int top; // 栈顶指针
int capacity; // 栈容量
int* array; // 栈数组
};
// 创建一个栈
struct stack* create_stack(int capacity) {
struct stack* new_stack = (struct stack*)malloc(sizeof(struct stack));
new_stack->capacity = capacity;
new_stack->top = -1; // 初始时栈为空
new_stack->array = (int*)malloc(capacity * sizeof(int));
return new_stack;
}
// 判断栈是否为空
int is_empty(struct stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int is_full(struct stack* s) {
return s->top == s->capacity - 1;
}
// 入栈操作
void push(struct stack* s, int item) {
if (is_full(s)) {
printf("Stack Overflow\n");
return;
}
s->array[++s->top] = item;
}
// 出栈操作
int pop(struct stack* s) {
if (is_empty(s)) {
printf("Stack Underflow\n");
return -1;
}
return s->array[s->top--];
}
// 获取栈顶元素
int peek(struct stack* s) {
if (is_empty(s)) {
printf("Stack Underflow\n");
return -1;
}
return s->array[s->top];
}
// 十进制转换为其他进制
void decimal_to_other(int num, int base) {
struct stack* s = create_stack(100); // 创建一个栈
while (num > 0) {
push(s, num % base); // 将余数入栈
num /= base;
}
printf("转换结果为:");
while (!is_empty(s)) {
printf("%d", pop(s)); // 依次弹出栈中元素
}
printf("\n");
}
// 二进制转换为十进制
int binary_to_decimal(char* binary) {
int decimal = 0;
int len = strlen(binary);
for (int i = 0; i < len; i++) {
decimal += (binary[i] - '0') * (1 << (len - i - 1)); // 按位展开累加
}
return decimal;
}
// 八进制转换为十进制
int octal_to_decimal(char* octal) {
int decimal = 0;
int len = strlen(octal);
for (int i = 0; i < len; i++) {
decimal += (octal[i] - '0') * (1 << (3 * (len - i - 1))); // 按位展开累加
}
return decimal;
}
// 十六进制转换为十进制
int hex_to_decimal(char* hexadecimal) {
int decimal = 0;
int len = strlen(hexadecimal);
for (int i = 0; i < len; i++) {
if (hexadecimal[i] >= '0' && hexadecimal[i] <= '9') {
decimal += (hexadecimal[i] - '0') * (1 << (4 * (len - i - 1))); // 按位展开累加
} else if (hexadecimal[i] >= 'A' && hexadecimal[i] <= 'F') {
decimal += (hexadecimal[i] - 'A' + 10) * (1 << (4 * (len - i - 1))); // 按位展开累加
}
}
return decimal;
}
// 其他进制转换为十进制
void other_to_decimal(char* num, int base) {
int decimal = 0;
int len = strlen(num);
for (int i = 0; i < len; i++) {
if (num[i] >= '0' && num[i] <= '9') {
decimal += (num[i] - '0') * (1 << (base * (len - i - 1))); // 按位展开累加
} else if (num[i] >= 'A' && num[i] <= 'F') {
decimal += (num[i] - 'A' + 10) * (1 << (base * (len - i - 1))); // 按位展开累加
}
}
printf("转换结果为:%d\n", decimal);
}
int main() {
char binary[100], octal[100], hexadecimal[100];
int decimal, base;
printf("请输入一个十进制数:");
scanf("%d", &decimal);
printf("请输入要转换的进制(2、8、16):");
scanf("%d", &base);
decimal_to_other(decimal, base);
printf("请输入一个二进制数:");
scanf("%s", binary);
printf("转换结果为:%d\n", binary_to_decimal(binary));
printf("请输入一个八进制数:");
scanf("%s", octal);
printf("转换结果为:%d\n", octal_to_decimal(octal));
printf("请输入一个十六进制数:");
scanf("%s", hexadecimal);
printf("转换结果为:%d\n", hex_to_decimal(hexadecimal));
printf("请输入一个其他进制数:");
scanf("%s", binary);
printf("请输入该数的进制(2、8、16):");
scanf("%d", &base);
other_to_decimal(binary, base);
return 0;
}
```
该代码利用了栈的数据结构来实现进制间的转换,可以实现二进制、八进制、十进制、十六进制之间的相互转换。您可以根据需要输入不同的数值和进制,进行转换。
阅读全文