解题思路:假如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
#include <math.h> //含有overflow
#define S_SIZE 100 //栈的空间大小
typedef struct SqStack{
int top; //栈顶
int maxtop; //栈最大的存储空间
int *stack;
}SqStack;
//初始化空栈
void InitStack(SqStack &S)
{
S.stack=(int *)malloc(S_SIZE*sizeof(int)); //动态申请一维数组
S.maxtop=S_SIZE;
S.top=-1;
}
//判断空栈
int StackEmpty(SqStack &S)
{
if(S.top==-1)
return 1;
else
return 0;
}
//判断栈满
int StackFull(SqStack &S)
{
if(S.top==S.maxtop)
return 1;
else
return 0;
}
//进栈
void push(SqStack &S,int x)
{
if(StackFull(S))
printf("overflow\n");
S.stack[++S.top]=x;
}
//出栈
int pop(SqStack &S)
{
int x;
if(StackEmpty(S))
printf("underflow\n");
x=S.stack[S.top];
S.top--;
return x;
}
//进制转化函数
void convert(SqStack &S,int N,int n)
{
int i,x;
do
{
push(S,N%n);
N/=n;
} while (N!=0);
while(!StackEmpty(S))
{
x=pop(S);
if(x>9) //十六进制时输出字母
{
x=x+55;
printf("%c",x);
}
else
printf("%d",x);
}
printf("\n");
}
//清空栈
void StackClear(SqStack &S)
{
S.top=-1;
}
int main()
{
int n,N;//要转换成的进制数和要转换的数
SqStack s;
scanf("%d%d",&n,&N) ;
InitStack(s);
printf("%d转换为%d进制后为:\n",n,N);
convert(s,n,N);
StackClear(s);
return 0;
}