栈实现二进制转换成十进制

NOTICE: 本题代码是按照源码顺序贴上的,复制可直接运行

环境: Visual Stdio Code

说明:本篇转换思路参考 小甲鱼-进制转换 不要喷,小编口水过敏~谢谢各位少侠

分析:

用栈实现进制转换需要有:栈的初始化函数、入栈函数、出栈函数、显示栈元素等函数。而且需要考虑一个问题:怎么才能让输入的一个整型二进制数(如:1100)按位一 一入栈?

入栈原理图:

即:我们可以利用 char 类型进行存储,这样计算机自动将每一位设置一个地址,这样就能实现按位入栈,从而能够按位出栈。

代码:

初始化:

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

#define STACK_INIT_SIZE 10 // 存储空间初始分配量
#define STACKINCREMENT 1 // 存储空间分配增量
#define OK 1
#define ERROR 0

typedef int Status;
typedef char SElemType;

typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

Status InitStack(SqStack &S)
{   // 初始化
    S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S.base) return ERROR;
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}//InitStack

销毁:

Status DestroyStack(SqStack &S)
{   // 销毁
    if(S.base)
    {
        delete S.base;
        S.stacksize = 0;
        S.base = S.top = NULL;
    }
    return OK;
}//DestroyStack

入栈:

Status Push(SqStack &S, SElemType e)
{   // 入栈
    if(S.top - S.base == S.stacksize)
    {
        S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!S.base) return ERROR;
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top ++= e;
    return OK;
}//Push

出栈:

Status Pop(SqStack &S, SElemType *e)
{   // 出栈
    if(S.top == S.base) return ERROR;
    *e = *--S.top;
    return OK;
}//Pop

打印栈容量:

Status StackLength(SqStack &S)
{   // 栈的容量
    return S.top - S.base;
}//StackLength

显示栈:

Status StackTraverse(SqStack &S)
{   // 打印栈
    SElemType *p = (SElemType *)malloc(sizeof(SElemType));
    p = S.top;
    if(!p) return ERROR;
    else
    {
        p--;
        while(p >= S.base)
        {
            printf("%d\t", *p);
            p--;
        }
    }
    return OK;
}//StackTraverse

主函数:

int main()
{
    int i, length, sum = 0;
    SqStack S;
    SElemType e;
    
    if(InitStack(S)) printf("\n初始化栈成功!\n");
    StackTraverse(S);
    printf("\n请输入想要转换的二进制数:\n");
    scanf("%c", &e);
    while(e != '\n')
    {
        Push(S, e);
        scanf("%c", &e);
    }
    getchar();
    length = StackLength(S);
    printf("\n栈的当前容量为:%d\n", length);
    printf("\n当前的栈为:\n");
    StackTraverse(S);

    for(i = 0; i < length; i ++)
    {
        Pop(S, &e);
        sum += (e-48) * pow(2, i);
        printf("\n这个 e 为:%d\n", e);
    }
    printf("\n对应的十进制为%d\n", sum);
    DestroyStack(S);     // 养成用完就释放内存的好习惯!!!!
    return 0;
}

注意:

值得一提的是,在主函数中的出栈操作时,如果写成

Pop(S, e);

就只会将最后一个字符复制 StackLength(S) 次,并出栈,从而产生一个错的结果,如下图所示:

而一个空格(即: \n)的 ASCII 码正好是10,也就是将 10 “copy” 了 4 次!当然,本篇代码没问题(在小编的环境下运行不报错)。

结果示意图:

THE END!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章