第五周项目二

来源:互联网 发布:软件测试员工资怎么样 编辑:程序博客网 时间:2024/05/16 17:50
建立结构体
[csharp] view plain copy print?
  1. typedef char ElemType;  
  2. typedef struct linknode  
  3. {  
  4.     ElemType data;              //数据域   
  5.     struct linknode *next;      //指针域  
  6. } LiStack;                      //链栈类型定义  

所用到的函数声明

[csharp] view plain copy print?
  1. void InitStack(LiStack *&s);  //初始化栈  
  2. void DestroyStack(LiStack *&s);  //销毁栈  
  3. int StackLength(LiStack *s);  //返回栈长度  
  4. bool StackEmpty(LiStack *s);  //判断栈是否为空  
  5. void Push(LiStack *&s,ElemType e);  //入栈  
  6. bool Pop(LiStack *&s,ElemType &e);  //出栈  
  7. bool GetTop(LiStack *s,ElemType &e);  //取栈顶元素  
  8. void DispStack(LiStack *s);  //输出栈中元素  


各函数实现

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

在main函数中的调用

[csharp] view plain copy print?
  1. int main()  
  2. {  
  3.     ElemType e;  
  4.     LiStack *s;  
  5.     printf("(1)初始化链栈s\n");  
  6.     InitStack(s);  
  7.     printf("(2)链栈为%s\n",(StackEmpty(s)?"空":"非空"));  
  8.     printf("(3)依次进链栈元素a,b,c,d,e\n");  
  9.     Push(s,'a');  
  10.     Push(s,'b');  
  11.     Push(s,'c');  
  12.     Push(s,'d');  
  13.     Push(s,'e');  
  14.     printf("(4)链栈为%s\n",(StackEmpty(s)?"空":"非空"));  
  15.     printf("(5)链栈长度:%d\n",StackLength(s));  
  16.     printf("(6)从链栈顶到链栈底元素:");DispStack(s);  
  17.     printf("(7)出链栈序列:");  
  18.     while (!StackEmpty(s))  
  19.     {   Pop(s,e);  
  20.         printf("%c ",e);  
  21.     }  
  22.     printf("\n");  
  23.     printf("(8)链栈为%s\n",(StackEmpty(s)?"空":"非空"));  
  24.     printf("(9)释放链栈\n");  
  25.     DestroyStack(s);  
  26.     return 0;  
  27. }  

运行结果截图




链式栈的优点之一:

不会出现栈满的情况。

原创粉丝点击