题目要求
    编写一段程序,要求从终端输入一串0/1表示的二进制数,输出它的八进制表达形式。
    题目分析
    进行数制转换这类运算最简单的方法就是使用栈的数据结构。
    (1)在输入二进制数时,将每次输入的0/1压入栈A中保存。
    (2)转换时,要将二进制的每三位转换成八进制的一位,先得到的是八进制的低位数,因此可以将八进制数保存到一个新的栈B中,知道将栈A中的元素取完为止。
    (3)最后将栈B 中的八进制逐一取出显示即可。
    (初始化,入栈,出栈等) 进制存储用ASCII码值。


    程序如下:

    #include"stdio.h"
    #include"math.h"
    #define STACK_INIT_SIZE 20
    #define STACKINCREMENT 10
    
    typedef char Elemtype;
    typedef struct {
      Elemtype *top;
      Elemtype *base;
      int stacksize;
    }sqstack;
    
    //初始化栈
    void initstack(sqstack *s)
    {
        //内存中开辟一段连续的空间作为栈空间,首地址给s->base
        s->base=(Elemtype *)malloc(sizeof(Elemtype)*STACK_INIT_SIZE);
        if(!s->base) exit(0);
        s->top=s->base;
        s->stacksize=STACK_INIT_SIZE;
     }
    
     //入栈操作,将e压入栈中
     void push(sqstack *s,Elemtype e)
     {
        if(s->top-s->base>=s->stacksize)
        s->base=(Elemtype *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(Elemtype));
        if(!s->base) exit(0);
        s->top=s->base+s->stacksize;        //追加空间首地址加上原大小为顶
        s->stacksize=s->stacksize+STACKINCREMENT;  
        *(s->top)=e;
        s->top++;
     }
    
     //出栈操作,用e将栈顶元素返回
     void pop(sqstack *s,Elemtype *e)
     {
         if(s->top==s->base)  return ;
         *e=*--(s->top);
     }
    
     //计算栈当前长度
     int stacklen(sqstack *s)
     {
        return(s->top-s->base);
     }
    
     main()
    {
          sqstack s1,s2;
          Elemtype c;
          int len,i,j,sum=0;
          initstack(&s1);
          printf("Please input a binary number and type # for end\n");
          scanf("%c",&c);
          while(c!='#')
          {
             if('c'==0||'c'==1)
                   push(&s1,c);
             scanf("%c",&c);
          }    
          initstack(&s2);
          len=stacklen(&s1);
          for(i=0;i<len;i=i+3)
          {
              for(j=0;j<3;j++)
             {
                 pop(&s1,&c);
                 sum=sum+(c-48)*pow(2,j);
                 if(s1.top==s1.base) break;  //有可能不是3的倍数
             }
             push(&s2,sum+48);
             sum=0;                         //计算八进制每一位时别忘了sum清0
          }
         //输出八进制内容
          while(s2->top!=s2->base)
        {
            pop(&s2,&c);
            printf("%d",c);
         }
        getche();
    }

    更多推荐

    二进制/八进制转换器