C语言数据结构用 栈 实现进制转化

直接上代码,思路看注释;

/*栈实现进制转化
 *十进制最大转化为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),可以省略 
}

猜你喜欢

转载自blog.csdn.net/weixin_42088653/article/details/84169521