600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 栈应用:实现二进制转八进制 十进制 十六进制

栈应用:实现二进制转八进制 十进制 十六进制

时间:2021-11-27 00:02:02

相关推荐

栈应用:实现二进制转八进制 十进制 十六进制

进制转换原理

二进制转十进制

二进制是计算机数据的存储形式,它是由一串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 5typedef 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();//去掉换行符 \nswitch (menu) {case 1:BinaryToDeci();break;case 2:BinaryToOct();break;case 3:BinaryToHex();break;default:menu = 0;break;}}return 0;}

运行结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。