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!