直接上代码,思路看注释;
/*栈实现进制转化
*十进制最大转化为36进制用10(A)-35(Z)表示
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 10 //栈的初始空间
#define STACKINCREMENT 5 //追加的存储空间
//结构体
typedef struct {
int *base;
int *top;
int stacksize;
}Stack;
//Create static
void InitStack(Stack *s){
s->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!s->base){ //申请存储空间失败,直接退出
exit(0);
}
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
//Insert function
void Push(Stack *s,int e){
if(s->top-s->base>STACK_INIT_SIZE){//若栈已满,追加存储空间
s->base = (int *)malloc(sizeof(int)*(STACK_INIT_SIZE+STACKINCREMENT));
if(!s->base){
exit(0);
}
s->top = s->base+s->stacksize; //栈顶指针发生变化
s->stacksize += STACKINCREMENT; //存储空间发生变化
}
*++s->top = e;//栈顶指针先加一,然后赋值
}
//main function
main(){
Stack S;
int n,m; //n进制数,m基数
InitStack(&S);
while(1){ //方便多次测试程序,可以省略
printf("\n请你输入十进制整数以及转换的基数:");
scanf("%d %d",&n,&m);
int s = n; //保存n的数值
if(m>36){
printf("输入的基数不满足条件,退出程序");
return ;
}
printf("十进制%d转化成%d进制结果为:",s,m);
if(n<0){ //若为负数,添加负号
n = abs(n);//负数取绝对值
printf("-");
}
while(n){
Push(&S,n%m);//十进制数取余入栈
n/=m;
}
while(S.top!=S.base){//若栈不为空,继续循环出栈
if(*S.top<=9){
printf("%d ",*S.top--);//数字直接取值,然后栈顶指针减一
}
else {//if(*S.top>9&&*S.top<=36){
printf("%c ",*S.top+55);
S.top--;
}
}
printf("\n");
}//对应while(1),可以省略
}