转换思路:
本代码实现的是十进制向二进制、八进制、十六进制的转换。代码主体用栈来实现。我们首先来看看十进制转二进制的方法,转换法则是将十进制数除以2倒取余,就是说先除出来的余数是二进制的最高位,最后出来的余数是二进制的最低位。我们知道栈的主要特点就是先进后出,这就可以帮助我们实现最先出来的余数是最高位的效果。只要将求出来的余数依次入栈,然后依次出栈即可。我们以十进制数10转二进制为例,具体转化过程如下图。
具体转换的实现:
栈有两种存储结构,顺序存储和链式存储,我们在这采用顺序存储。那么我们需要定义一个结构体,结构体里面有一个int类型的数组,还有一个top用来存储栈顶元素的下标。具体定义如下图所示:
接下来我们需要写几个关于栈的操作,如栈的创建,进栈,出栈,摧毁栈等。
我们可以新建一个stack.c文件来专门写关于栈的操作函数,新建一个stack.h来定义结构体和声明函数,这样下次有要用到栈的地方就可以直接包含这个文件对应的头文件。
功能实现部分采取菜单模式,由自己选择向多少进制转换,需用户手动退出。
具体代码如下:
stack.c文件:
#include "stack.h"
#include "stdlib.h"
#include "stdio.h"
//创建一个空栈
Sqstack * Stack_Creat(Sqstack * Stack)
{
Stack = (Sqstack *)malloc(sizeof(Sqstack));
if(Stack == NULL)
{
printf("空间已满!\n");
return 0;
}
Stack->top = -1; //空栈
return Stack;
}
//摧毁栈
void Stack_Destory(Sqstack * Stack)
{
free(Stack);
}
//出栈
ElemType Stack_Pop(Sqstack * Stack)
{
ElemType e=-1;
if(Stack->top == -1)
printf("该栈为空栈,无法出栈!\n");
else
{
e = Stack->data[Stack->top];
Stack->top--;
}
return e;
}
//入栈
void Stack_Push(Sqstack * Stack,ElemType e)
{
if(Stack->top == MaxSize - 1)
{
printf("栈已满,无法入栈!\n");
}
else
{
Stack->top++;
Stack->data[Stack->top] = e;
}
}
//判断栈是否为空
int Stack_Empty(Sqstack * Stack)
{
return (Stack->top == -1 );
}
stack.h文件:
#ifndef __STACK_H
#define __STACK_H
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int top;
}Sqstack;
Sqstack * Stack_Creat(Sqstack * Stack);
void Stack_Destory(Sqstack * Stack);
ElemType Stack_Pop(Sqstack * Stack);
void Stack_Push(Sqstack * Stack,ElemType e);
int Stack_Empty(Sqstack * Stack);
#endif
函数主体功能实现部分,这里你随意建一个.c文件即可,代码如下:
#include "stack.h"
#include <stdio.h>
void DTB(int num,Sqstack * Stack)
{
char num_b[33] ; //用来存放转换出来的二进制
char * temp = num_b;
while(num) //入栈
{
Stack_Push(Stack,num%2);
num /= 2;
}
while(!Stack_Empty(Stack))//出栈 直到栈为空
{
*temp = Stack_Pop(Stack) + '0';
temp++;
}
*temp = '\0';
printf("该数对应的二进制数为:%s\n",num_b);
}
void DTO(int num,Sqstack * Stack)
{
char num_o[12] ; //用来存放转换出来的二进制
char * temp = num_o;
while(num) //入栈
{
Stack_Push(Stack,num%8);
num /= 8;
}
while(!Stack_Empty(Stack))//出栈 直到栈为空
{
*temp = Stack_Pop(Stack) + '0';
temp++;
}
*temp = '\0';
printf("该数对应的八进制数为:%s\n",num_o);
}
void DTH(int num,Sqstack * Stack)
{
char num_h[12] ; //用来存放转换出来的二进制
char * temp = num_h;
int top_num;
while(num) //入栈
{
Stack_Push(Stack,num%16);
num /= 16;
}
while(!Stack_Empty(Stack))//出栈 直到栈为空
{
top_num = Stack_Pop(Stack);
if(top_num>9)
*temp = top_num - 10 + 'A';
else
*temp = top_num + '0';
temp++;
}
*temp = '\0';
printf("该数对应的十六进制数为:%s\n",num_h);
}
void run()
{
int flag=1,a,num_d;
Sqstack * Stack;
Stack = Stack_Creat(Stack);
printf("请输入一个十进制数:");
scanf("%d",&num_d);
while(flag)
{
printf("**************************************\n");
printf("* 1.十进制转二进制 *\n");
printf("* 2.十进制转八进制 *\n");
printf("* 3.十进制转十六进制 *\n");
printf("* 4.重新输入十进制数 *\n");
printf("* 5.退出 *\n");
printf("**************************************\n");
printf("请进行模式选择:");
scanf("%d",&a);
switch(a)
{
case 1: DTB(num_d,Stack);break;
case 2: DTO(num_d,Stack);break;
case 3: DTH(num_d,Stack);break;
case 4: printf("请重新输入:");scanf("%d",&num_d);break;
case 5: Stack_Destory(Stack);flag = 0; break;
default: printf("没有这个选项") ;break;
}
}
}
void main()
{
run();
}