第五周项目三

来源:互联网 发布:淘宝怎么设置地区运费 编辑:程序博客网 时间:2024/05/16 12:24
/*
Copyright (c++) 2017,烟台大学计算机与控制工程学院
文件名称:sqstack
作 者:zhangsiqi
完成日期:2017年9月28日
版 本 号:12.11
问题描述:定义链栈存储结构,实现其基本运算,并完成测试
输入描述:无
输出描述:输出栈长度 ,输出从栈顶到栈底元素 ,并输出出栈序列 .

*/

[cpp] view plain copy print?
  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  

[cpp] view plain copy print?
  1. #include <stdio.h>   
  2. #include <malloc.h>   
  3. #include "sqstack.h"   
  4.   
  5. void InitStack(LiStack *&s)  //初始化栈  
  6. {  
  7.     s=(LiStack *)malloc(sizeof(LiStack));  
  8.     s->next=NULL;  
  9. }  
  10.   
  11. void DestroyStack(LiStack *&s)  //销毁栈  
  12. {  
  13.     LiStack *p=s->next;  
  14.     while (p!=NULL)  
  15.     {  
  16.         free(s);  
  17.         s=p;  
  18.         p=p->next;  
  19.     }  
  20.     free(s);    //s指向尾结点,释放其空间   
  21. }  
  22.   
  23. int StackLength(LiStack *s)  //返回栈长度  
  24. {  
  25.     int i=0;  
  26.     LiStack *p;  
  27.     p=s->next;  
  28.     while (p!=NULL)  
  29.     {  
  30.         i++;  
  31.         p=p->next;  
  32.     }  
  33.     return(i);  
  34. }  
  35.   
  36. bool StackEmpty(LiStack *s)  //判断栈是否为空  
  37. {  
  38.     return(s->next==NULL);  
  39. }  
  40.   
  41. void Push(LiStack *&s,ElemType e)  //入栈  
  42. {  
  43.     LiStack *p;  
  44.     p=(LiStack *)malloc(sizeof(LiStack));  
  45.     p->data=e;              //新建元素e对应的节点*p  
  46.     p->next=s->next;        //插入*p节点作为开始节点  
  47.     s->next=p;  
  48. }  
  49.   
  50. bool Pop(LiStack *&s,ElemType &e)  //出栈  
  51. {  
  52.     LiStack *p;  
  53.     if (s->next==NULL)      //栈空的情况  
  54.         return false;  
  55.     p=s->next;              //p指向开始节点  
  56.     e=p->data;  
  57.     s->next=p->next;        //删除*p节点  
  58.     free(p);                //释放*p节点   
  59.     return true;  
  60. }  
  61.   
  62. bool GetTop(LiStack *s,ElemType &e)  //取栈顶元素  
  63. {  
  64.     if (s->next==NULL)      //栈空的情况  
  65.         return false;  
  66.     e=s->next->data;  
  67.     return true;  
  68. }  
  69.   
  70. void DispStack(LiStack *s)  //输出栈中元素  
  71. {  
  72.     LiStack *p=s->next;  
  73.     while (p!=NULL)  
  74.     {  
  75.         printf("%c ",p->data);  
  76.         p=p->next;  
  77.     }  
  78.     printf("\n");  
  79. }  

[cpp] view plain copy print?
  1. #include <stdio.h>   
  2. #include "sqstack.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. }  


知识点:头文件:listack.h,包含定义链栈数据结构的代码、宏定义、要实现算法的函数的声明。listack.cpp,包含实现各种算法的函数的定义

学习心得:算法库的建立对以后的问题解决提供了帮助。

原创粉丝点击