用两个栈实现二进制到八进制的转换C语言

最近在从头开始研究数据结构与算法,将最近自己写的实例与大家分享,也希望大家多多提意见。

直接上代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>


#define STACK_INIT_SIZE 50
#define STACK_INCREMENT 20


typedef char ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stacksize;
}sqStack;


void InitStack(sqStack *s)
{
    s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if( !s->base )
    {
        printf("STACK INIT FAILED!\n");
        exit(0);
    }
    s->top = s->base;
    s->stacksize = STACK_INIT_SIZE;
}


void Push(sqStack *s,ElemType e)
{
    if(s->top - s->base >= s->stacksize)
    {
        s->base = (ElemType *)realloc(s->base, (STACK_INIT_SIZE + STACK_INCREMENT) * sizeof(ElemType)); //超出重新分配栈的大小
        if( !s->base )
        {
            exit(0);
        }
    }
    *s->top = e;
    s->top++;
}


void Pop(sqStack *s,ElemType *e)
{
    if(s->top == s->base)
    {
        printf("STACK IS EMPTY ,NO ELEMENT CAN BE POPPED!\n");
        return;
    }
    *e = *--(s->top);
}
void ClearStack(sqStack *s)
{
    if(s->top != s->base)
    {
        s->top = s->base;
    }
}
int GetStackSize(sqStack *s)
{
    return (s->top - s->base);
}
int main()
{
    sqStack bin;
    sqStack oct;
    ElemType e,c_input;
    int sum = 0;
    int i = 0,j,stack_size_bin,stack_size_oct;
    InitStack(&bin);
    InitStack(&oct);
    printf("please input a binary: end with '#' \n");
    scanf("%c",&c_input);
    while(c_input != '#')
    {
        Push(&bin,c_input);
        scanf("%c",&c_input);
    }
    getchar();


    stack_size_bin = GetStackSize(&bin);
    while(i < stack_size_bin)
    {


        for(j = 0;j < 3;j++)
        {


            Pop(&bin, &e);
            sum += (e - 48) * pow(2, j);
            i++;
            if(i >= stack_size_bin)
            {
                break;
            }


        }
        Push(&oct, (char)sum);
        sum = 0;


    }
    stack_size_oct = GetStackSize(&oct);
    for(i = 0; i < stack_size_oct; i++)
    {
        Pop(&oct, &e);
        printf("%c ",e + 48);   //要注意ASCII码转换
    }
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,我可以为您解答关于使用C语言顺序实现十进制转换二进制八进制和十六进制的问题。 首先,您需要一些基本的知识。十进制是我们平常使用的数字系统,有 0~9 一共 10 个数字。二进制是计算机使用的数字系统,只有 0 和 1 两个数字。八进制是由 0~7 八个数字组成的数字系统,十六进制是由 0~9 和 A~F 共 16 个数字组成的数字系统。 现在,我们开始讲解如何实现十进制转换为其他进制: 1. 二进制转换 首先,我们可以使用除 2 取余法来实现十进制转换二进制。具体步骤如下: 1) 初始化一个顺序,将十进制数依次入; 2) 然后反中的元素,依次出,并将该元素除以二的余数压入新的中; 3) 直到取完最后一个元素,将中所有元素出并输出即可。 下面是示例代码: void DecToBin(int dec) { int rem; SeqStack S; InitStack(&S); while (dec) { Push(&S, dec % 2); dec /= 2; } while (!StackIsEmpty(S)) { Pop(&S, &rem); printf("%d", rem); } } 2. 八进制转换 我们可以使用除 8 取余法来实现十进制转换八进制。具体步骤如下: 1) 初始化一个顺序,将十进制数依次入; 2) 然后反中的元素,依次出,并将该元素除以八的余数压入新的中; 3) 直到取完最后一个元素,将中所有元素出并输出即可。 示例代码如下: void DecToOct(int dec) { int rem; SeqStack S; InitStack(&S); while (dec) { Push(&S, dec % 8); dec /= 8; } while (!StackIsEmpty(S)) { Pop(&S, &rem); printf("%d", rem); } } 3. 十六进制转换 我们可以将十进制数转换二进制数,然后将二进制数每 4 位一组转换为对应的十六进制数字。具体步骤如下: 1) 先调用上面的十进制二进制的函数 DecToBin(int dec) 来得到该十进制数对应的二进制数; 2) 然后将得到的二进制数每 4 位一组,将每组的二进制转换为对应的十六进制数字; 3) 最后将多个十六进制数字拼接起来即可。 示例代码如下: void DecToHex(int dec) { int bin[100], hex[100], i = 0, j, n; char hex_char[16] = "0123456789ABCDEF"; SeqStack S; InitStack(&S); while (dec) { Push(&S, dec % 2); dec /= 2; } while (!StackIsEmpty(S)) { Pop(&S, &bin[i++]); } n = ceil((double)i / 4); for (j = 0; j < n * 4; ++j) { if (j < i) { hex[j / 4] <<= 1; hex[j / 4] |= bin[i - j - 1]; } else { hex[j / 4] <<= 1; } } for (j = n - 1; j >= 0; --j) { printf("%c", hex_char[hex[j]]); } } 希望可以帮到您,如有疑问请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值