进制转化之递归 && 栈
将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 }
可以看到,实现了数组方式的栈,但这个方式存在一些问题,需要优化,还没有达到专业软件工程师的要求,后面会实现一个基于表和另一个基于数组的栈的实现,那个时候将会做适当的调整。这个只是当做一个大战前的热身。
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |