您的位置:首页 > 其它

利用栈实现进制的转换!

2012-12-13 14:50 330 查看
问题:将十进制数转换为任意进制数(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");
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: