DS之栈实现数制转换(补充)

       在计算机进制转换的时候,最常用的就是二进制,八进制,十进制,和十六进制,以及它们之间的转换。而在现实生活中最常用的十进制数是我们一贯的作风。在计算机系统最常用的是二进制,十六进制,八进制。

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

        输出的结果为:

        二进制结果:

DS之栈实现数制转换(补充)_第1张图片

 

        八进制结果:

DS之栈实现数制转换(补充)_第2张图片

 

        十六进制结果:

DS之栈实现数制转换(补充)_第3张图片

 

 

 

    

 


 


 

 

你可能感兴趣的:(数据结构,二进制,数据,计算机,栈)