进制的转换(栈的应用)

将十进制数N和其他d进制数之间进行转换是计算机实现计算的基本问题,解决方案很多,其中最简单的方法是除d取余法。例如,(1348)10=(2504)8,其转化过程如下所示:
N N div 8 N mod 8
1348 168 4
168 21 0
21 2 5
2 0 2
从中可以看出,最先产生的余数4是转换结果的最低位,这正好符合栈的“后进先出”的特性。所以可以用顺序栈来模拟这个过程。
下面给出代码实现

#include 
#include 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef struct
{	ElemType *base;  //基指针 
	ElemType *top;  //栈顶指针 
	int stacksize; //当前空间 
 }SqStack;
 int InitStack(SqStack &s)  //栈的初始化 
 {
 	s.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
 	if(!s.base) return 0;
 	s.top=s.base;
 	s.stacksize=STACK_INIT_SIZE;
 	return 1;
  } 
int Push(SqStack &s,ElemType e) //栈的插入 
{
	if(s.top-s.base>=s.stacksize)
	{ s.base=(ElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(ElemType));
	if(!s.base) return 0;
	s.top=s.base+s.stacksize;
	s.stacksize+=STACKINCREMENT;
	}
	*s.top++=e;
	return 1;
}
int Pop(SqStack &s,ElemType &e) //栈的删除 
{
	if(s.top==s.base) return 0;
	e=*--s.top;
}
void tran_2(SqStack s,ElemType N) //8进制转换函数 
{  ElemType e;
   while(N)
   {
   	Push(s,N%2);
   	N=N/2;
   }
   printf("转换为2进制数为:"); 
   while(s.base!=s.top)
   {
   	Pop(s,e);
   	printf("%d",e);
   }	
 }
void tran_8(SqStack s,ElemType N) //8进制转换函数 
{  ElemType e;
   while(N)
   {
   	Push(s,N%8);
   	N=N/8;
   }
   printf("转换为8进制数为:"); 
   while(s.base!=s.top)
   {
   	Pop(s,e);
   	printf("%d",e);
   }	
 }
void tran_16(SqStack s,ElemType N) //16进制转换函数 
{  ElemType e;
   while(N)
   { if(N%16<10)
   	Push(s,N%16);
   	else
   	 { switch(N%16)
   	   { case 10:Push(s,65);break;
   	   	case 11:Push(s,66);break;
   	   	case 12:Push(s,67);break;
   	   	case 13:Push(s,68);break;
   	   	case 14:Push(s,69);break;
   	   	case 15:Push(s,70);break;  	   	
		  }	
		}
   	N=N/16;
   }
	printf("转换为16进制数为:"); 
   while(s.base!=s.top)
   {	if(*(s.top-1)>=0&&*(s.top-1)<10)
   		{  Pop(s,e);
   	   	   printf("%d",e);
	   	}
	   else
	   { Pop(s,e);
	     printf("%c",e);
	   }
   }	
 }
void menu() //打印菜单 
 { printf("---------------------------------------------2.转换为2进制----------------------------------------------------------"); 
   printf("\n---------------------------------------------8.转换为8进制---------------------------------------------------------");
   printf("\n---------------------------------------------16.转换为16进制-------------------------------------------------------\n");
 }
int main()
{  SqStack s;
   int choose; 
   ElemType N;
   InitStack(s);
   printf("输入十进制数:");
   scanf("%d",&N);
   printf("\n输入要转换的进制数:\n");
   menu();
   p:
   scanf("%d",&choose);
   switch(choose)
   { case 2:tran_2(s,N);break;
   	 case 8:tran_8(s,N);break;
   	 case 16:tran_16(s,N);break;
   	 default :printf("没有此进制,请重新输入");goto p;
   }
	return 0;
}

进制的转换(栈的应用)_第1张图片

你可能感兴趣的:(数据结构,算法,数据结构,栈,c语言)