数据结构趣题——二进制/八进制转换

   1: #include <stdio.h>
   2: #include <math.h>
   3: #include <stdlib.h>
   4: #define STACK_INIT_SIZE 20
   5: #define STACKINCREMENT 10
   6:  
   7: typedef  char ElemType;
   8: typedef struct {
   9:     ElemType *base;
  10:     ElemType *top;
  11:     int stacksize;
  12: } sqStack;
  13:  
  14: void initStack(sqStack *s)
  15: {
  16:     /*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
  17:     s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  18:  
  19:     if(!s->base) exit(0);     /*分配空间失败*/
  20:  
  21:     s->top = s->base;       /*最开始,栈顶就是栈底*/
  22:     s->stacksize = STACK_INIT_SIZE;   /*最大容量为STACK_INIT_SIZE */
  23: }
  24:  
  25: void Push(sqStack *s, ElemType e) {
  26:     if(s->top - s->base >= s->stacksize) {
  27:         /*栈满,追加空间*/
  28:         s->base = (ElemType *)realloc(s->base, (s->stacksize +
  29:                                                 STACKINCREMENT) * sizeof(ElemType));
  30:  
  31:         if(!s->base) exit(0);   /*存储分配失败*/
  32:  
  33:         s->top = s->base + s->stacksize;
  34:         s->stacksize = s->stacksize + STACKINCREMENT; /*设置栈的最大容量*/
  35:     }
  36:  
  37:     *(s->top) = e;  /*放入数据*/
  38:     s->top++;
  39: }
  40:  
  41: void Pop(sqStack *s , ElemType *e) {
  42:     if(s->top == s->base) return;
  43:  
  44:     *e = *--(s->top);
  45: }
  46:  
  47: int StackLen(sqStack s) {
  48:     return (s.top - s.base) ;
  49: }
  50:  
  51: int main()
  52: {
  53:     ElemType c;
  54:     sqStack s1;
  55:     sqStack s2;
  56:     int len, i, j, sum = 0;
  57:     initStack(&s1);  /*创建一个栈s1,用来存放二进制字符串*/
  58:  
  59:     printf("Please input a binary number and type '#' for end\n");
  60:     /*输入0/1字符表示的二进制数,以#结束*/
  61:     scanf("%c", &c);
  62:  
  63:     while(c != '#')
  64:     {
  65:         if(c == '0' || c == '1')
  66:             Push(&s1, c);
  67:  
  68:         scanf("%c", &c);
  69:     }
  70:  
  71:     initStack(&s2);  /*创建一个栈s2,用来存放八进制字符串*/
  72:     len = StackLen(s1);  /*得到栈中的元素个数,即二进制数的长度*/
  73:  
  74:     for(i = 0; i < len; i = i + 3) {
  75:         for(j = 0; j < 3; j++) {
  76:             Pop(&s1, &c); /*取出栈顶元素*/
  77:             sum = sum + (c - 48) * pow(2, j); /*转换为八进制数*/
  78:  
  79:             if(s1.base == s1.top) break;
  80:         }
  81:  
  82:         Push(&s2, sum + 48) ; /*将八进制数以字符形式压入栈中*/
  83:         sum = 0;
  84:  
  85:     }
  86:  
  87:     printf("The Octal from is \n") ;
  88:  
  89:     while(s2.base != s2.top ) { /*输出八进制栈的内容*/
  90:         Pop(&s2, &c);
  91:         printf("%c", c);
  92:     }
  93: }
原文地址:https://www.cnblogs.com/steven_oyj/p/1746022.html