[置顶] 栈应用:实现二进制转八进制、十进制、十六进制
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; }
运行结果
相关文章推荐
- 用java语言实现各种进制转换(二进制,八进制,十进制,十六进制互转,主要使用Java Swing技术)
- 栈的应用之二进制转换为十进制,八进制和十六进制
- 关于使用查表法实现十进制到二进制,八进制,十六进制的转换
- C++实现二进制、八进制、十进制、十六进制的相互转换
- PHP实现各进制间的转换 十进制与二进制、八进制、十六进制间的互换
- 2017级公共课 计算机应用 第二次作业 十进制 二进制 十六进制 八进制
- 二进制,八进制,十进制和十六进制 之间的关系转换
- 二进制、八进制、十进制、十六进制之间转换
- 十进制二进制 八进制 十六进制
- java中 二进制 八进制 十六进制 十进制 相互转换 最简方法
- 二进制、八进制、十进制、十六进制之间转换
- 二进制、八进制、十进制、十六进制之间的转换
- java 二进制,八进制,十进制,十六进制间相互转换的方法
- 整数的十进制、二进制、八进制与十六进制
- C#各种进制之间数据转换二进制、八进制、十进制、十六进制
- [JAVA]二进制,八进制,十六进制,十进制间进行相互转换
- 十进制 二进制 八进制 十六进制
- 进制转换:二进制、八进制、十六进制、十进制之间的转换
- 二进制、八进制、十进制、十六进制之间转换
- java 二进制,八进制,十进制,十六进制间相互转换的方法