用栈实现将十进制数转换为任意进制数(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;
 }
 


  • 26
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值