问题描述及代码:
[cpp] view plain copy
1. /*
2. *烟台大学计控学院
3. *作 者:朱建豪
4. *完成日期:2016年9月29日
5. *问题描述:定义链栈存储结构,实现其基本运算,并完成测试。
6. */
(1)listack.h
[cpp] view plain copy
1. #ifndef LISTACK_H_INCLUDED
2. #define LISTACK_H_INCLUDED
3.
4. typedef char ElemType;
5. typedef struct linknode
6. {
7. ElemType data; //数据域
8. struct linknode *next; //指针域
9. } LiStack; //链栈类型定义
10.
11. void InitStack(LiStack *&s); //初始化栈
12. void DestroyStack(LiStack *&s); //销毁栈
13. int StackLength(LiStack *s); //返回栈长度
14. bool StackEmpty(LiStack *s); //判断栈是否为空
15. void Push(LiStack *&s,ElemType e); //入栈
16. bool Pop(LiStack *&s,ElemType &e); //出栈
17. bool GetTop(LiStack *s,ElemType &e); //取栈顶元素
18. void DispStack(LiStack *s); //输出栈中元素
19.
20.
21. #endif // LISTACK_H_INCLUDED
(2)listack.cpp
[cpp] view plain copy
1. #include <stdio.h>
2. #include <malloc.h>
3. #include "listack.h"
4. void InitStack(LiStack *&s) //初始化栈
5. {
6. s=(LiStack *)malloc(sizeof(LiStack));
7. s->next=NULL;
8. }
9.
10. void DestroyStack(LiStack *&s) //销毁栈
11. {
12. LiStack *p=s->next;
13. while (p!=NULL)
14. {
15. free(s);
16. s=p;
17. p=p->next;
18. }
19. free(s); //s指向尾结点,释放其空间
20. }
21.
22. int StackLength(LiStack *s) //返回栈长度
23. {
24. int i=0;
25. LiStack *p;
26. p=s->next;
27. while (p!=NULL)
28. {
29. i++;
30. p=p->next;
31. }
32. return(i);
33. }
34.
35. bool StackEmpty(LiStack *s) //判断栈是否为空
36. {
37. return(s->next==NULL);
38. }
39.
40. void Push(LiStack *&s,ElemType e) //入栈
41. {
42. LiStack *p;
43. p=(LiStack *)malloc(sizeof(LiStack));
44. p->data=e; //新建元素e对应的节点*p
45. p->next=s->next; //插入*p节点作为开始节点
46. s->next=p;
47. }
48.
49. bool Pop(LiStack *&s,ElemType &e) //出栈
50. {
51. LiStack *p;
52. if (s->next==NULL) //栈空的情况
53. return false;
54. p=s->next; //p指向开始节点
55. e=p->data;
56. s->next=p->next; //删除*p节点
57. free(p); //释放*p节点
58. return true;
59. }
60.
61. bool GetTop(LiStack *s,ElemType &e) //取栈顶元素
62. {
63. if (s->next==NULL) //栈空的情况
64. return false;
65. e=s->next->data;
66. return true;
67. }
68.
69. void DispStack(LiStack *s) //输出栈中元素
70. {
71. LiStack *p=s->next;
72. while (p!=NULL)
73. {
74. printf("%c ",p->data);
75. p=p->next;
76. }
77. printf("\n");
78. }
(3)main.cpp
[cpp] view plain copy
1. #include <stdio.h>
2. #include "listack.h"
3.
4. int main()
5. {
6. ElemType e;
7. LiStack *s;
8. printf("(1)初始化链栈s\n");
9. InitStack(s);
10. printf("(2)链栈为%s\n",(StackEmpty(s)?"空":"非空"));
11. printf("(3)依次进链栈元素a,b,c,d,e\n");
12. Push(s,'a');
13. Push(s,'b');
14. Push(s,'c');
15. Push(s,'d');
16. Push(s,'e');
17. printf("(4)链栈为%s\n",(StackEmpty(s)?"空":"非空"));
18. printf("(5)链栈长度:%d\n",StackLength(s));
19. printf("(6)从链栈顶到链栈底元素:");DispStack(s);
20. printf("(7)出链栈序列:");
21. while (!StackEmpty(s))
22. { Pop(s,e);
23. printf("%c ",e);
24. }
25. printf("\n");
26. printf("(8)链栈为%s\n",(StackEmpty(s)?"空":"非空"));
27. printf("(9)释放链栈\n");
28. DestroyStack(s);
29. return 0;
30. }
运行结果:
<img src="https://img-blog.csdn.net/20160929112722903?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结:
熟练运用链栈的基本运算
学习心得:
希望可以通过对程序的读写可以加深自己对算法的认识
第五周项目2-建立链栈算法库
最新推荐文章于 2017-10-15 18:32:34 发布