C語言資料結構用 棧 實現進位制轉化
阿新 • • 發佈:2018-12-22
直接上程式碼,思路看註釋;
/*棧實現進位制轉化 *十進位制最大轉化為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),可以省略 }