您的位置:首页 > 其它

用栈实现将十进制数转换为任意进制数(2,8,16...).

2016-03-06 15:19 169 查看
解题思路:假如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;
 }


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