利用栈实现进制的转换!

问题:将十进制数转换为任意进制数(2,8,16...).

 

算法:假如N为输入的数,n为要转换为的进制,若要将十进制231转换为8进制数,过程如下;

N                        N/n                      N%n

231                   28                         7

28                      3                           4

3                        0                           3

则输出为347,可以看出,首先得到的应该是7,然后才是4,最后是3,但是要逆序显示,自然就类似压栈出栈的数据结构了(数组也可以实现,但是没有体现其本质).

所以,只需要初始化栈后,将N%n不断的压入栈底,需要注意的是如果要转换为16进制,则需要对大于9的数字作字符处理。

/*栈的基本操作*/
#include <stdio.h>
#include <malloc.h>   //malloc,realloc
#include <math.h>     //含有overflow
#include <process.h>
#define S_SIZE 100   //栈的空间大小
#define STACKINCREAMENT 10//增加空间
struct SqStack{
 int *base; //栈底
 int *top;  //栈顶
 int stacksize;   //栈当前的存储空间
};
//主函数开始
void main()
{//子函数声明
void InitStack(SqStack &S);//初始化空栈
int StackEmpty(SqStack S);//判空
void GetTop(SqStack S,int &e);//获得栈顶元素
void push(SqStack &S,int e);//进栈
void pop(SqStack &S,int &e);//出栈
void convert(SqStack &S,int N,int n);//十进制转N进制
int i,num;
unsigned n,N;//要转换成的进制数和要转换的数
SqStack s;
InitStack(s);//初始化空栈
printf("输入要转换的十进制数和要转换为的进制数:\n");
scanf("%d,%d",&N,&n);
printf("%d转换为%d进制后为:\n",N,n);
convert(s,N,n);
}
void InitStack(SqStack &S)
{S.base=(int *)malloc(S_SIZE*sizeof(int));
 S.stacksize=S_SIZE;
 S.top=S.base;//初始化空栈
}
int StackEmpty(SqStack S)
{
   if(S.base==S.top)
	   return 1;
   else
	   return 0;
}
void GetTop(SqStack S,int &e)
{//获得栈顶元素
	e=*(S.top-1);
}
void push(SqStack &S,int e)
{//进栈
  if(S.top-S.base>=S.stacksize)
  {S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
  S.top=S.base+S.stacksize;
  S.stacksize+=STACKINCREAMENT;}
  *(S.top)=e;
  S.top++;	  
}
void pop(SqStack &S,int &e)
{//出栈
 if(S.base!=S.top)
 {S.top--;
 e=*S.top;}
}
void convert(SqStack &S,int N,int n)
{
  InitStack(S);
  do 
  {push(S,N%n);
  N/=n;
  } while (N!=0);
  int i,e;
  while(!StackEmpty(S))
  { pop(S,e);
    if(e>9)//十六进制时输出字母
	{e=e+55;
    printf("%c",e);}
	else
    printf("%d",e);
  }
  printf("\n");
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值