栈--利用栈实现进制转换

作者: 我可能是个假开发 | 来源:发表于2018-03-30 15:33 被阅读132次

    利用栈实现进制转换

    一、二进制转十进制

    利用栈的数据结构特点,将二进制转换为十进制数。

    二进制数是计算机数据的存储形式,它是由一串0和1组成的,每个二进制数转换成相应的十进制数方法如下:
    (XnXn-1……X3X2X1)2 = X12^0+X221+…+Xn*2(n-1)

    一个二进制数要转换为相应的十进制数,就是从最低位起用每一位去乘以对应位的积,也就是说用第n位去乘以2^(n-1),然后全部加起来。

    二进制转十进制.png

    由于栈具有后进先出的特性,
    例如输入11001001这样的二进制数,
    如图:

    栈中的二进制数.png

    代码实现:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define STACK_INIT_SIZE 20   
    #define STACKINCREMENT  10
    
    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 )
        {
            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, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
            if( !s->base )
            {
                exit(0);
            }
        }
    
        *(s->top) = e;
        s->top++;
    }
    
    void Pop(sqStack *s, ElemType *e)
    {
        if( s->top == s->base )
        {
            return;
        }
        *e = *--(s->top);
    }
    
    int StackLen(sqStack s)
    {
        return (s.top - s.base);
    }
    
    int main()
    {
        ElemType c;
        sqStack s;
        int len, i, sum = 0;
    
        InitStack(&s);
    
        printf("请输入二进制数,输入#符号表示结束!\n");
        scanf("%c", &c);
        while( c != '#' )
        {
            Push(&s, c);
            scanf("%c", &c);
        }
    
        getchar();  // 把'\n'(回车)从缓冲区去掉
    
        len = StackLen(s);
        printf("栈的当前容量是: %d\n", len);
    
        for( i=0; i < len; i++ )
        {
            Pop(&s, &c);
            sum = sum + (c-48) * pow(2, i);
        }
    
        printf("转化为十进制数是: %d\n", sum);
    
        return 0;
    }
    

    二、二进制转八进制

    二进制是计算机唯一认识的,十进制是人们通常使用的。

    观察二进制跟十六进制的对应关系:

    二进制与十六进制的对应关系.png

    可见一个字节(8bit)刚好用两个十六进制数可以表示完整,也大大的节省了显示空间。

    八进制:因为早期的计算机系统都是三的倍数,所以用八进制比较方便。

    在进行二进制到八进制的转换时,要将二进制数的每三位转换成一个八进制数来表示,然后按顺序输出即可。

    1.png 2.png 3.png

    代码实现:

    /**  二进制/八进制转换器   **/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define STACK_INIT_SIZE 20
    #define STACKINCREMENT  10
    
    typedef char ElemType;
    typedef struct
    {
        ElemType *base;
        ElemType *top;
        int stackSize;
    }sqStack;
    
    // 函数功能:初始化栈
    // 参数*s:栈的地址
    void InitStack(sqStack *s)
    {
        s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
        if( !s->base )
        {
            exit(0);
        }
    
        s->top = s->base;
        s->stackSize = STACK_INIT_SIZE;
    }
    
    // 函数功能:入栈操作
    // 参数*s:栈的地址
    // 参数e:待压入栈的元素
    void Push(sqStack *s, ElemType e)
    {
        if( s->top - s->base >= s->stackSize )
        {
            s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
            if( !s->base )
            {
                exit(0);
            }
    
            s->top = s->base + s->stackSize;
            s->stackSize = s->stackSize + STACKINCREMENT;
        }
    
        *(s->top) = e;
        s->top++;
    }
    
    // 函数功能:弹栈操作
    // 参数*s:栈的地址
    // 参数e:存放从栈里弹出的数据
    void Pop(sqStack *s, ElemType *e)
    {
        if( s->top == s->base )
        {
            return;
        }
        *e = *--(s->top);
    }
    
    // 函数功能:计算栈s的当前长度
    // 参数s:栈
    int StackLen(sqStack s)
    {
        return (s.top - s.base);
    }
    
    int main()
    {
        ElemType c;
        sqStack s1;
        sqStack s2;
        int len, i, j, sum = 0;
    
        InitStack(&s1); // 初始化栈s1,用来存放二进制输入
    
        printf("请输入二进制数,输入‘#’号表示结束!\n\n");
        scanf("%c", &c);
        while( c != '#' )
        {
            if( c=='0' || c=='1' )  // 检查输入是否二进制
                Push(&s1, c);
            scanf("%c", &c);
        }
        getchar();      // 把'\n'从缓冲区去掉
        len = StackLen(s1);
    
        InitStack(&s2); // 初始化栈s2,用来存放转换的八进制
    
        for( i=0; i < len; i+=3 )
        {
            for( j=0; j < 3; j++ )
            {
                Pop( &s1, &c ); // 取出栈顶元素
                sum = sum + (c-48) * pow(2, j);
    
                if( s1.base == s1.top )
                {
                    break;
                }
            }
    
            Push( &s2, sum+48 );
            sum = 0;
        }
    
        printf("\n转化为八进制数是: ");
        while( s2.base != s2.top )
        {
            Pop( &s2, &c );
            printf("%c", c);
        }
        printf("(O)\n");
    
        return 0;
    }
    

    三、二进制转十六进制

    代码实现:

    /** 二进制/十六进制转换器  **/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define STACK_INIT_SIZE 20
    #define STACKINCREMENT  10
    
    typedef char ElemType;
    typedef struct
    {
        ElemType *base;
        ElemType *top;
        int stackSize;
    }sqStack;
    
    // 函数功能:初始化栈
    // 参数*s:栈的地址
    void InitStack(sqStack *s)
    {
        s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
        if( !s->base )
        {
            exit(0);
        }
    
        s->top = s->base;
        s->stackSize = STACK_INIT_SIZE;
    }
    
    // 函数功能:入栈操作
    // 参数*s:栈的地址
    // 参数e:待压入栈的元素
    void Push(sqStack *s, ElemType e)
    {
        if( s->top - s->base >= s->stackSize )
        {
            s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
            if( !s->base )
            {
                exit(0);
            }
    
            s->top = s->base + s->stackSize;
            s->stackSize = s->stackSize + STACKINCREMENT;
        }
    
        *(s->top) = e;
        s->top++;
    }
    
    // 函数功能:弹栈操作
    // 参数*s:栈的地址
    // 参数e:存放从栈里弹出的数据
    void Pop(sqStack *s, ElemType *e)
    {
        if( s->top == s->base )
        {
            return;
        }
        *e = *--(s->top);
    }
    
    // 函数功能:计算栈s的当前长度
    // 参数s:栈
    int StackLen(sqStack s)
    {
        return (s.top - s.base);
    }
    
    int main()
    {
        ElemType c;
        sqStack s1;
        sqStack s2;
        int len, i, j, sum = 0;
    
        InitStack(&s1); // 初始化栈s1,用来存放二进制输入
    
        printf("请输入二进制数,输入‘#’号表示结束!\n\n");
        scanf("%c", &c);
        while( c != '#' )
        {
            if( c=='0' || c=='1' )  // 检查输入是否二进制
                Push(&s1, c);
            scanf("%c", &c);
        }
        getchar();      // 把'\n'从缓冲区去掉
        len = StackLen(s1);
    
        InitStack(&s2); // 初始化栈s2,用来存放转换的八进制
    
        for( i=0; i < len; i+=4 )
        {
            for( j=0; j < 4; j++ )
            {
                Pop( &s1, &c ); // 取出栈顶元素
                sum = sum + (c-48) * pow(2, j);
    
                if( s1.base == s1.top )
                {
                    break;
                }
            }
    
            switch( sum )
            {
                case 10: sum = 'A'; break;
                case 11: sum = 'B'; break;
                case 12: sum = 'C'; break;
                case 13: sum = 'D'; break;
                case 14: sum = 'E'; break;
                case 15: sum = 'F'; break;
                default: sum += 48;
            }
    
            Push( &s2, sum );
            sum = 0;
        }
    
        printf("\n转化为十六进制数是: ");
        while( s2.base != s2.top )
        {
            Pop( &s2, &c );
            printf("%c", c);
        }
        printf("(H)\n");
    
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:栈--利用栈实现进制转换

        本文链接:https://www.haomeiwen.com/subject/fpsicftx.html