利用栈先进后出的特性,在函数内部,进行除二取余的操作,把每次的余数存入栈内,最后输出刚好就是逆序输出,为二进制数
学习过程中,对存储栈进行堆区的内存申请时候,并不是很熟练,一开始还在想去接收的类型应该是什么,后面发现直接用S->data去进行接收即可,本身就是datytype *类型
1、使用栈,完成进制转换
输入:一个整数,进制数
输出:该数的对应的进制数
//zhuanhuan.h
#ifndef ZHUANHUAN_H
#define ZHUANHUAN_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
#define MAX 10
typedef struct Stack
{
datatype *data;
int top;
}Stack,*StackPtr;
//创建栈
StackPtr stack_create();
//判空
int stack_empty(StackPtr S);
//判满
int stack_full(StackPtr S);
//进制转换
void stack_zhuanhuan(StackPtr S,datatype e);
//遍历栈
void stack_show(StackPtr S);
#endif
//zhuanhuan.c
#include"zhuanhuan.h"
//创建栈
StackPtr stack_create()
{
StackPtr S = (StackPtr)malloc(sizeof(Stack));
if(NULL == S)
{
printf("创建失败\n");
return NULL;
}
//为储存栈申请空间
S->data = (datatype *)malloc(sizeof(S->data)*MAX);
if(NULL == S->data)
{
printf("创建失败\n");
return NULL;
}
memset(S->data,0,sizeof(S->data)*MAX);
S->top = -1;
printf("创建成功\n");
return S;
}
//判空
int stack_empty(StackPtr S)
{
return S->top == -1;
}
//进制转换
void stack_zhuanhuan(StackPtr S,datatype e)
{
if(NULL == S)
{
printf("转换失败\n");
return;
}
while(e) //当e为0的时候退出循环
{
S->top += 1; //每次存入时,top的指向都要先递增1后再去往里面去存内容
S->data[S->top] = e % 2;
e /= 2;
}
}
//遍历栈
void stack_show(StackPtr S)
{
if(NULL == S || stack_empty(S))
{
printf("遍历失败\n");
return;
}
printf("该数的二进制数是:");
for(int i = S->top;i >= 0;i--)
{
printf("%d",S->data[i]);
}
printf("\n");
}
//main.c
#include"zhuanhuan.h"
int main(int argc, char const *argv[])
{
int n = 0;
//创建一个栈
StackPtr S = stack_create();
printf("请输入一个你需要转换的十进制数:");
scanf("%d",&n);
getchar();
//在函数内部循环吧余数依次放入栈内
stack_zhuanhuan(S,n);
//栈会逆序输出,故刚好为二进制数
stack_show(S);
return 0;
}
输出结果如下: