在计算机进制转换的时候,最常用的就是二进制,八进制,十进制,和十六进制,以及它们之间的转换。而在现实生活中最常用的十进制数是我们一贯的作风。在计算机系统最常用的是二进制,十六进制,八进制。
在上一次使用顺序栈实现进制转换的时候,一直在考虑十六进制的问题,最终也没有实现,就收手了。过了一天,再次尝试着看代码,也问了好多的同学,都不会,他们所做的只是进行十进制以下的进制转换,我考虑的十六进制没有人解释。白天一直在想是哪里出错了,输出的结果为什么会多出多余的数字,知道问题出在进制转换函数,而且在出栈的输出问题上,尝试了几次switch语句,还是一样的结果。再次尝试if语句,还是一样的结果,这就说明肯定在出栈的输出有了问题,下午在看数据结构的知识,又尝试了一遍还是使用switch语句实现输出,采用最笨的方法输出,不再最简单的简化代码,最后终于实现了十六进制的转换,也是一次代码调试的能力考验。
下面是错的转换函数代码:
<span style="font-size:18px;">//进制转换函数 void conversion(int n,int r) { SqStack S;//构建一个栈 InitStack(S); while(n) { Push(S,n%r);//数据入栈 n=n/r; } while(!StackEmpty(S)) { SElemType e; Pop(S,e);//数据出栈 switch(e) { case 10: cout<<"A"; break; case 11: cout<<"B"; break; case 12: cout<<"C"; break; case 13: cout<<"D"; break; case 14: cout<<"E"; break; case 15: cout<<"F"; break; default: break; } cout<<e; } cout<<endl; }</span>
问题就出现在cout<<e;这条输出语句上,它包含了出栈的所有的数据,在自己所写的switch语句也包含了出栈的数据的输出,导致出现的结果出错,比如输入的十进制数为255,出现的结果为:F15F15。
下面的是自己今天所修改的代码:
<span style="font-size:18px;">//进制转换函数 void conversion(int n,int r) { SqStack S;//构建一个栈 InitStack(S); while(n) { Push(S,n%r);//数据入栈 n=n/r; } while(!StackEmpty(S)) { SElemType e; Pop(S,e);//数据出栈 switch(e) { case 0: cout<<"0"; break; case 1: cout<<"1"; break; case 2: cout<<"2"; break; case 3: cout<<"3"; break; case 4: cout<<"4"; break; case 5: cout<<"5"; break; case 6: cout<<"6"; break; case 7: cout<<"7"; break; case 8: cout<<"8"; break; case 9: cout<<"9"; break; case 10: cout<<"A"; break; case 11: cout<<"B"; break; case 12: cout<<"C"; break; case 13: cout<<"D"; break; case 14: cout<<"E"; break; case 15: cout<<"F"; break; } } cout<<endl; } </span>
去掉cout<<e;语句用最笨的方法实现出栈的数据的输出,依然使用switch语句,也是有限制的,所转换的进制只能局限在十六进制以下。
完整的顺序栈实现进制转换的代码为:
<span style="font-size:18px;">#include <iostream> using namespace std; //两个C语言的头文件库 #include <malloc.h> #include <stdlib.h> //以下是宏定义 #define OK 1 #define ERROW 0 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 #define INFEASIBLE -1 #define STACK_INIT_SIZE 100//存储空间初始分配量 #define STACKINCREMENT 10//存储空间分配增量 //以下是类型重新定义 typedef int SElemType;//重新定义SElemType为int型 typedef int Status;//重新定义Status为int型 //下面的是栈的定义和基本操作 typedef struct{//重新定义SqStck为结构类型 SElemType *base;//栈底指针 SElemType *top;//栈顶指针 int stacksize;//栈的当前可使用的最大容量 }SqStack; //1构造一个空栈 Status InitStack(SqStack &S) { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) { exit(OVERFLOW);//存储分配失败 } S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } //2判断栈是否为空 Status StackEmpty(SqStack S) { if(S.base==S.top) { return TRUE; } else { return FALSE; } } //7出栈 Status Pop(SqStack &S,SElemType &e) { if(S.top==S.base) { return ERROW; } e=*--S.top; return OK; } //8进栈 Status Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { //栈满追加存储空间 SElemType *newbase=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!newbase) { exit(OVERFLOW); } S.base=newbase; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return OK; } //进制转换函数 void conversion(int n,int r) { SqStack S;//构建一个栈 InitStack(S); while(n) { Push(S,n%r);//数据入栈 n=n/r; } while(!StackEmpty(S)) { SElemType e; Pop(S,e);//数据出栈 switch(e) { case 0: cout<<"0"; break; case 1: cout<<"1"; break; case 2: cout<<"2"; break; case 3: cout<<"3"; break; case 4: cout<<"4"; break; case 5: cout<<"5"; break; case 6: cout<<"6"; break; case 7: cout<<"7"; break; case 8: cout<<"8"; break; case 9: cout<<"9"; break; case 10: cout<<"A"; break; case 11: cout<<"B"; break; case 12: cout<<"C"; break; case 13: cout<<"D"; break; case 14: cout<<"E"; break; case 15: cout<<"F"; break; } } cout<<endl; } //主函数 int main() { int n1;//十进制数 int r1;//十六以下进制数 cout<<"输入你所要进行转换的十进制数据:"; cin>>n1; cout<<"输入你所要进行转换的进制数:"; cin>>r1; conversion(n1,r1);//调用进制转换函数 return 0; }</span>
输入的十进制数为255,分别转换为二进制数,八进制数,十六进制数
输出的结果为:
二进制结果:
八进制结果:
十六进制结果: