利用栈实现进制转换

 转换思路:

      本代码实现的是十进制向二进制、八进制、十六进制的转换。代码主体用栈来实现。我们首先来看看十进制转二进制的方法,转换法则是将十进制数除以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();
}

     

  • 32
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤鹜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值