栈应用:实现二进制转八进制、十进制、十六进制 您所在的位置:网站首页 十六进制与十进制之间的转换器是 栈应用:实现二进制转八进制、十进制、十六进制

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

#栈应用:实现二进制转八进制、十进制、十六进制| 来源: 网络整理| 查看: 265

进制转换原理 二进制转十进制 二进制是计算机数据的存储形式,它是由一串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 (octbase = 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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有