您的位置:首页 > 其它

[置顶] 栈应用:实现二进制转八进制、十进制、十六进制

2018-01-21 21:15 525 查看

进制转换原理

二进制转十进制

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

二进制转八进制

利用二进制转十进制原理,从低位起将每3位二进制转为1位十进制 然后进行替换即可

二进制转十六进制

利用二进制转十进制原理,从低位起将每4二进制位转为1位十进制然后进行替换即可,不过在16进制中用 a、b、c、d、e、f 代替10、11、12、13、14、15

如何用栈实现进制转换?

如果对栈这种数据结构不熟悉的,可以先看 栈的顺序存储及实现(二)栈的顺序存储及实现(一)

二进制转十进制

首先我们来看二进制转十进制。利用栈先进后出的原理,将输入的二进制数压入栈中,高位在最下面,低位在上面,然后进行弹栈,将弹出的数转换为相应的十进制 进行累加即可得到对应的十进制

局部代码:

//二进制数栈
SeqStack binaryStack;
InitStack(&binaryStack);
while (1)
{
char num = 0;
scanf("%c", &num);
if (num == '\n')
{
break;
}
//压栈
push(&binaryStack, num);
}
int i = 0;
int dec = 0;//十进制数
while (!IsEmptyStack(&binaryStack))
{
char num = 0;
pop(&binaryStack, &num);
dec += (num - '0')*pow(2, i);
i++;
}


二进制转八进制

同样是先把二进制数压栈,然后 弹栈,不过 的是 3位二进制才转为1位八进制,这样就要把转出来的八进制放到另一栈中,此时八进制数的低位在栈底,高位在栈顶,再次利用栈的先进后出的原理进行弹栈,高位先弹出来,依次进行输出 就得到相应的八进制了

局部代码:

SeqStack binaryStack;//二进制数栈
SeqStack octStack;//八进制数栈
InitStack(&binaryStack);
InitStack(&octStack);

while (1)
{
char num = 0;
scanf("%c", &num);
if (num == '\n')
{
break;
}
//压栈
push(&binaryStack, num);
}

while (1)
{
char num = 0;
int oct = 0;//8进制数
for (int i = 0; i < 3; i++)
{
if (IsEmptyStack(&binaryStack))
{
break;
}
pop(&binaryStack, &num);
oct += (num - '0')*pow(2, i);
}
//将八进制数压入到栈中
push(&octStack, oct + '0');
if (IsEmptyStack(&binaryStack))
{
break;
}
}


二进制转十六进制

和二进制转八进制一模一样,不过的是需要4位二进制位转1位十六进制,其余都是一样。

局部代码:

SeqStack binaryStack;//二进制数栈
SeqStack hexStack;//十六进制数栈
InitStack(&binaryStack);
InitStack(&hexStack);

while (1)
{
char num = 0;
scanf("%c", &num);
if (num == '\n')
{
break;
}
//压栈
push(&binaryStack, num);
}

while (1)
{
char num = 0;
int oct = 0;//十六进制数
for (int i = 0; i < 4; i++)
{
if (IsEmptyStack(&binaryStack))
{
break;
}
pop(&binaryStack, &num);
oct += (num - '0')*pow(2, i);
}
//将十六进制数压入到栈中
if (oct<10)
{
push(&hexStack, oct + '0');
}
else
{
push(&hexStack, oct-10 + 'a');
}
if (IsEmptyStack(&binaryStack))
{
break;
}
}


完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 5
#define STACK_INCREMENT 5
typedef int Status;
typedef char EleType;

typedef struct SeqStack
{
EleType* top;//栈顶指针
EleType* base;//栈底指针
int stackSize;//栈容量
}SeqStack;
//初始化栈
Status InitStack(SeqStack* stack)
{
//开辟空间
stack->base = stack->top = (EleType*)malloc(STACK_INIT_SIZE * sizeof(EleType));
if (!stack->base)
{
exit(0);
}
return OK;
}
//压栈
Status push(SeqStack* stack, EleType e)
{
if (stack == NULL)
{
return ERROR;
}
//压栈之前检测容量是否足够
if (stack->top - stack->base == stack->stackSize)
{
//超出容量 进行扩容,使用realloc函数,会拷贝原内存内容
stack->base = (SeqStack*)realloc(stack->base, stack->stackSize + STACK_INCREMENT);
if (!stack->base)
{
exit(0);
}
stack->top = stack->base + stack->stackSize;
stack->stackSize += STACK_INCREMENT;
}
*stack->top = e;
stack->top++;
return OK;
}
//弹栈
Status pop(SeqStack* stack, EleType *e)
{
if (stack == NULL || e == NULL)
{
return ERROR;
}
//空栈
if (stack->top == stack->base)
{
return ERROR;
}
*stack->top--;
*e = *stack->top;
return OK;
}
/*
判断栈是否为空
*/
int IsEmptyStack(SeqStack* stack) {
if (NULL == stack) {
return ERROR;
}
if (stack->top == stack->base) {
return TRUE;
}
return FALSE;
}
/*
销毁栈
*/
Status DestroyStack(SeqStack* stack)
{
if (NULL == stack) {
return ERROR;
}
//销毁栈 是释放栈在内存中占用的空间资源
if (!stack->base)
{
free(stack->base);
}
stack->top = stack->base = NULL;
stack->stackSize = 0;
return OK;
}
//二进制 转 十进制
void BinaryToDeci()
{

printf("请输入二进制:");
//二进制数栈
SeqStack binaryStack;
InitStack(&binaryStack);
while (1)
{
char num = 0;
scanf("%c", &num);
if (num == '\n')
{
break;
}
//压栈
push(&binaryStack, num);
}
int i = 0;
int dec = 0;//十进制数
while (!IsEmptyStack(&binaryStack))
{
char num = 0;
pop(&binaryStack, &num);
dec += (num - '0')*pow(2, i);
i++;
}
printf("对应的十进制:%d\n", dec);
DestroyStack(&binaryStack);
}
//二进制 转 八进制
void BinaryToOct()
{
printf("请输入二进制:");
SeqStack binaryStack;//二进制数栈
SeqStack octStack;//八进制数栈
InitStack(&binaryStack);
InitStack(&octStack);

while (1)
{
char num = 0;
scanf("%c", &num);
if (num == '\n')
{
break;
}
//压栈
push(&binaryStack, num);
}

while (1)
{
char num = 0;
int oct = 0;//8进制数
for (int i = 0; i < 3; i++)
{
if (IsEmptyStack(&binaryStack))
{
break;
}
pop(&binaryStack, &num);
oct += (num - '0')*pow(2, i);
}
//将八进制数压入到栈中
push(&octStack, oct + '0');
if (IsEmptyStack(&binaryStack))
{
break;
}
}
printf("对应的八进制:");
while (!IsEmptyStack(&octStack))
{
char num = 0;
pop(&octStack, &num);
putchar(num);
}
printf("\n");
DestroyStack(&binaryStack);
DestroyStack(&octStack);
}
//二进制 转 十六进制
void BinaryToHex()
{
printf("请输入二进制:");
SeqStack binaryStack;//二进制数栈
SeqStack hexStack;//十六进制数栈
InitStack(&binaryStack);
InitStack(&hexStack);

while (1)
{
char num = 0;
scanf("%c", &num);
if (num == '\n')
{
break;
}
//压栈
push(&binaryStack, num);
}

while (1)
{
char num = 0;
int oct = 0;//十六进制数
for (int i = 0; i < 4; i++)
{
if (IsEmptyStack(&binaryStack))
{
break;
}
pop(&binaryStack, &num);
oct += (num - '0')*pow(2, i);
}
//将十六进制数压入到栈中
if (oct<10)
{
push(&hexStack, oct + '0');
}
else
{
push(&hexStack, oct-10 + 'a');
}
if (IsEmptyStack(&binaryStack))
{
break;
}
}
printf("对应的十六进制:");
while (!IsEmptyStack(&hexStack))
{
char num = 0;
pop(&hexStack, &num);
putchar(num);
}
printf("\n");
DestroyStack(&binaryStack);
DestroyStack(&hexStack);
}

//二进制 转 八进制
int main(int argc, char *argv[])
{
int menu = 1;
while (menu)
{

printf("-------菜单-------\n");
printf("-------1、二进制转十进制-------\n");
printf("-------2、二进制转八进制-------\n");
printf("-------3、二进制转十六进制-------\n");
printf("-------0、退出-------\n");
printf("请输入菜单:");
scanf("%d", &menu);
getchar();//去掉换行符 \n
switch (menu) {
case 1:
BinaryToDeci();
break;
case 2:
BinaryToOct();
break;
case 3:
BinaryToHex();
break;
default:
menu = 0;
break;
}
}
return 0;
}


运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: