问题描述及代码:
[cpp] view plain copy
1. /*
2. *烟台大学计控学院
3. *作 者:朱建豪
4. *完成日期:2016年9月30日
5. *问题描述【项目 - 数制转换】 把十进制的整数转换为任一进制数输出。请利用栈设计算法,并实现程序。
6.
7.
8. 提示:要转换为r进制,则原来的数逐次除以基数r(除完之后用商再除),直到商为0,得到的一系列余数的逆序就是转换结果。这里的“逆序”,意味着后产生的余数,会先输出,后进先出,栈的机会来了……
9.
10. */
(1)sqstack.h
[cpp] view plain copy
1. #ifndef SQSTACK_H_INCLUDED
2. #define SQSTACK_H_INCLUDED
3.
4. #define MaxSize 100
5. typedef int ElemType;
6. typedef struct
7. {
8. ElemType data[MaxSize];
9. int top; //栈指针
10. } SqStack; //顺序栈类型定义
11.
12. void InitStack(SqStack *&s); //初始化栈
13. void DestroyStack(SqStack *&s); //销毁栈
14. bool StackEmpty(SqStack *s); //栈是否为空
15. int StackLength(SqStack *s); //返回栈中元素个数——栈长度
16. bool Push(SqStack *&s,ElemType e); //入栈
17. bool Pop(SqStack *&s,ElemType &e); //出栈
18. bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素
19. void DispStack(SqStack *s); //输出栈
20. void MultiBaseOutput (int number,int base);
21.
22.
23.
24.
25. #endif // SQSTACK_H_INCLUDED
(2)sqstack.cpp
[cpp] view plain copy
1. #include"sqstack.h"
2. #include<stdio.h>
3. #include<malloc.h>
4. void InitStack(SqStack *&s)
5. {
6. s=(SqStack *)malloc(sizeof(SqStack));
7. s->top=-1;
8. }
9. void DestroyStack(SqStack *&s)
10. {
11. free(s);
12. }
13. int StackLength(SqStack *s) //返回栈中元素个数——栈长度
14. {
15. return(s->top+1);
16. }
17. bool StackEmpty(SqStack *s)
18. {
19. return(s->top==-1);
20. }
21. bool Push(SqStack *&s,ElemType e)
22. {
23. if (s->top==MaxSize-1) //栈满的情况,即栈上溢出
24. return false;
25. s->top++;
26. s->data[s->top]=e;
27. return true;
28. }
29. bool Pop(SqStack *&s,ElemType &e)
30. {
31. if (s->top==-1) //栈为空的情况,即栈下溢出
32. return false;
33. e=s->data[s->top];
34. s->top--;
35. return true;
36. }
37. bool GetTop(SqStack *s,ElemType &e)
38. {
39. if (s->top==-1) //栈为空的情况,即栈下溢出
40. return false;
41. e=s->data[s->top];
42. return true;
43. }
44.
45. void DispStack(SqStack *s) //输出栈
46. {
47. int i;
48. for (i=s->top;i>=0;i--)
49. printf("%c ",s->data[i]);
50. printf("\n");
51. }
52. void MultiBaseOutput (int number,int base)
53. {
54. //假设number是非负的十进制整数,输出等值的base进制数
55. int i;
56. SqStack *S;
57. InitStack(S);
58. while(number)//从右向左产生base进制的各位数字,并将其进栈
59. {
60. Push(S,number%base);//将将余数进栈
61. number/=base;
62.
63. }
64. while(!StackEmpty(S))//栈非空时退栈输出
65. {
66. Pop(S,i);
67. printf("%d",i);
68.
69. }
70.
71. }
(3)main.cpp
[cpp] view plain copy
1. #include"sqstack.h"
2. #include<stdio.h>
3. int main()
4. {
5. MultiBaseOutput(10, 2);
6. return 0;
7. }
运行结果:
<img src="https://img-blog.csdn.net/20160930110043878?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结
要转换为r进制,则原来的数逐次除以基数r(除完之后用商再除),直到商为0,得到的一系列余数的逆序就是转换结果。这里的“逆序”,意味着后产生的余数,会先输出,后进先出是栈的特点。
学习心得:
栈的应用,从算法分析问题,再考虑栈的特点性质。
第五周项目4-数制转换
最新推荐文章于 2022-05-03 14:28:25 发布