zoukankan      html  css  js  c++  java
  • 进制转化之递归 && 栈

    将10进制转换成2进制,是除以2得到的余数,再倒序排列,这可以用递归实现,也可以用数据结构——栈实现。

    先看递归实现:

     1 #include<stdio.h>  
     2 void to_two(int num);
     3 int main()
     4 {
     5     int a = 10;
     6     to_two(a);
     7     
     8     return 0;
     9 }
    10 /*递归实现把一个数转成16/8/2进制*/
    11 //转16/8/2进制分别求余16/8/2,再除以16/8/2
    12 //10 转 2进制
    13 void to_two(int num)
    14 {
    15     if (num!=0)
    16     {
    17         int remainder = num % 2;
    18         to_two(num/2);
    19         printf("%d", remainder);//这个输出函数的位置如果和上一句对调位置,将顺序输出
    20     }
    21     else
    22     {
    23 
    24     }
    25 }

    递归的实现方式,需要一定的逻辑性,如果把上述的打印函数和递归调用调换位置,输出将反向。这里对于递归的基础知识不做解释,如果忘记了,查询相关资料。

    这里用递归能够很好的实现把最后求出的数先打印出来,对于这种先进后出,后进先出的模型,很自然会想到栈的实现。

    那么,下面用数组实现一个栈,完成这个转换:

     1 /*main.c*/
     2 
     3 #include<stdio.h>  
     4 #include"stack.h"
     5 int main()
     6 {
     7     int a[10] = { 1,2,3,3,3,3,3,3,3,4 };
     8     for (int i = 0; i < 10; i++)
     9         push(&selfstack, a[i]);
    10     while (!isEmpty(&selfstack))
    11     {
    12         printf("%d
    ", pop(&selfstack));
    13     }
    14     
    15     return 0;
    16 }
     1 /*stack.h*/
     2 
     3 #pragma once
     4 #include<malloc.h>
     5 #define N 50
     6 typedef int mytype;
     7 
     8 struct mystack {
     9     int top;
    10     mytype a[N];
    11 };
    12 
    13 struct mystack selfstack = { -1,0 };
    14 int isEmpty(struct mystack *S);
    15 void setEmpty(struct mystack *S);
    16 int push(struct mystack *S, mytype data);
    17 mytype pop(struct mystack *S);
    18 
    19 /*
    20 return 1: 是空栈 ;0:不是空栈
    21 */
    22 int isEmpty(struct mystack *S)
    23 {
    24     if (S->top == -1)
    25     {
    26         return 1;
    27     }
    28     else
    29     {
    30         return 0;
    31     }
    32 }
    33 /*
    34 没有malloc,可以简单这样设置空栈
    35 */
    36 void setEmpty(struct mystack *S)
    37 {
    38     S->top = -1;
    39 }
    40 /*
    41 return 0,失败,1,成功
    42 */
    43 int push(struct mystack *S, mytype data)
    44 {
    45     if (S->top == N - 1)
    46     {
    47         return 0;
    48     }
    49     else
    50     {
    51         S->top += 1;
    52         S->a[S->top] = data;
    53         return 1;
    54     }
    55 }
    56 
    57 mytype pop(struct mystack *S)
    58 {
    59     S->top -= 1;
    60     return S->a[S->top + 1];
    61     
    62 }

    可以看到,实现了数组方式的栈,但这个方式存在一些问题,需要优化,还没有达到专业软件工程师的要求,后面会实现一个基于表和另一个基于数组的栈的实现,那个时候将会做适当的调整。这个只是当做一个大战前的热身。

  • 相关阅读:
    ARM板卡ftp客户端应用
    vsftp移植(待续)
    /dev/null脚本中作用
    amazeui.css
    将td中文字过长的部分变成省略号显示的小技巧
    div非弹出框半透明遮罩实现全屏幕遮盖css实现
    重新定位svn地址的方法(windows和linux),svn switch(sw)的帮助信息
    linux 下启动SVN服务
    用SVN checkout源码时,设置账号
    svn提示out of date
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6559893.html
Copyright © 2011-2022 走看看