1. 程式人生 > >用棧實現將十進位制數轉換為任意進位制數(2,8,16...).

用棧實現將十進位制數轉換為任意進位制數(2,8,16...).

解題思路:假如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;
 }