在计算机进制转换的时候,最常用的就是二进制,八进制,十进制,和十六进制,以及它们之间的转换。而在现实生活中最常用的十进制数是我们一贯的作风。在计算机系统最常用的是二进制,十六进制,八进制。
在上一次使用顺序栈实现进制转换的时候,一直在考虑十六进制的问题,最终也没有实现,就收手了。过了一天,再次尝试着看代码,也问了好多的同学,都不会,他们所做的只是进行十进制以下的进制转换,我考虑的十六进制没有人解释。白天一直在想是哪里出错了,输出的结果为什么会多出多余的数字,知道问题出在进制转换函数,而且在出栈的输出问题上,尝试了几次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,分别转换为二进制数,八进制数,十六进制数
输出的结果为:
二进制结果:
八进制结果:
十六进制结果: