1. 程式人生 > >C語言資料結構用 棧 實現進位制轉化

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),可以省略 
}