用棧實現將十進位制數轉換為任意進位制數(2,8,16...).
阿新 • • 發佈:2019-01-27
解題思路:假如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; }