zoukankan      html  css  js  c++  java
  • 数据结构趣题——二进制/八进制转换

       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: }
  • 相关阅读:
    【原创】flash中DataGrid数据列显示顺序的解决办法(非数据排序)
    [译]C# 7系列,Part 2: Async Main 异步Main方法
    [译]C# 7系列,Part 1: Value Tuples 值元组
    我们是怎么做Code Review的
    Asp.Net 5 新增公告仓库
    微信现金红包高级红包接口开发注意事项
    解决Windows 8.1中所有的应用(Modern App)无法打开(闪退)的问题
    代码要恰如其分——记一次代码审查
    [译]DbContext API中使用SqlQuery和ExecuteSqlCommand获取存储过程的输入输出参数
    解决托管在Windows上的Stash的Pull request无法合并的问题
  • 原文地址:https://www.cnblogs.com/steven_oyj/p/1746022.html
Copyright © 2011-2022 走看看