用栈实现将十进制数转换为任意进制数(2,8,16...).

来源:互联网 发布:算法第四版中文电子书 编辑:程序博客网 时间:2024/06/05 02:55

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


0 0
原创粉丝点击