进制转化之递归 && 栈

将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\n", 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 }

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

 

posted @ 2017-03-16 15:47  Crystal_Guang  阅读(456)  评论(0编辑  收藏  举报