链式栈

简介: 来源:http://blog.csdn.net/hopeyouknow/article/details/6725049 栈是常用的数据结构之一,下面给出一个链式栈的实现~~ 头文件Stack.

 

来源:http://blog.csdn.net/hopeyouknow/article/details/6725049

栈是常用的数据结构之一,下面给出一个链式栈的实现~~

头文件Stack.h

  1. #ifndef Stack_H  
  2. #define Stack_H  
  3.   
  4. typedef int Item;  
  5. typedef struct node * PNode;  
  6. /*定义栈节点类型*/  
  7. typedef struct node  
  8. {  
  9.     Item data;  
  10.     PNode down;  
  11. }Node;  
  12. /*定义栈类型*/  
  13. typedef struct stack  
  14. {  
  15.     PNode top;  
  16.     int size;  
  17. }Stack;  
  18. /*构造一个空栈*/  
  19. Stack *InitStack();  
  20.   
  21. /*销毁一个栈*/  
  22. void DestroyStack(Stack *ps);  
  23.   
  24. /*把栈置空*/  
  25. void ClearStack(Stack *ps);  
  26.   
  27. /*判定是否为空栈*/  
  28. int IsEmpty(Stack *ps);  
  29.   
  30. /*返回栈大小*/  
  31. int GetSize(Stack *ps);  
  32.   
  33. /*返回栈顶元素*/  
  34. PNode GetTop(Stack *ps,Item *pitem);  
  35.   
  36. /*元素入栈*/  
  37. PNode Push(Stack *ps,Item item);  
  38.   
  39. /*元素出栈*/  
  40. PNode Pop(Stack *ps,Item *pitem);  
  41.   
  42. /*遍历栈并访问visit函数*/  
  43. void StackTraverse(Stack *ps,void (*visit)());  
  44.   
  45. #endif  


实现部分Stack.c

  1. #include"Stack.h"  
  2. #include<malloc.h>  
  3. #include<stdlib.h>  
  4. /*构造一个空栈*/  
  5. Stack *InitStack()  
  6. {  
  7.     Stack *ps = (Stack *)malloc(sizeof(Stack));  
  8.     if(ps!=NULL)  
  9.     {  
  10.         ps->top = NULL;  
  11.         ps->size = 0;  
  12.     }  
  13.     return ps;  
  14. }  
  15.   
  16. /*判定是否为空栈*/  
  17. int IsEmpty(Stack *ps)  
  18. {  
  19.     if(ps->top == NULL && ps->size == 0)  
  20.         return 1;  
  21.     else  
  22.         return 0;  
  23. }  
  24.   
  25. /*返回栈大小*/  
  26. int GetSize(Stack *ps)  
  27. {  
  28.     return ps->size;  
  29. }  
  30.   
  31. /*元素入栈*/  
  32. PNode Push(Stack *ps,Item item)  
  33. {  
  34.     PNode pnode = (PNode)malloc(sizeof(Node));  
  35.     if(pnode != NULL)  
  36.     {  
  37.         pnode->data = item;  
  38.         pnode->down = GetTop(ps,NULL);  
  39.         ps->size++;  
  40.         ps->top = pnode;  
  41.           
  42.     }  
  43.     return pnode;  
  44. }  
  45.   
  46. /*返回栈顶元素*/  
  47. PNode GetTop(Stack *ps,Item *pitem)  
  48. {  
  49.     if(IsEmpty(ps)!=1&&pitem!=NULL)  
  50.     {  
  51.         *pitem = ps->top->data;  
  52.     }  
  53.     return ps->top;  
  54. }  
  55.   
  56.   
  57. /*元素出栈*/  
  58. PNode Pop(Stack *ps,Item *pitem)  
  59. {  
  60.     PNode p = ps->top;  
  61.     if(IsEmpty(ps)!=1&&p!=NULL)  
  62.     {  
  63.         if(pitem!=NULL)  
  64.             *pitem = p->data;  
  65.         ps->size--;  
  66.         ps->top = ps->top->down;     
  67.         free(p);  
  68.     }  
  69.     return ps->top;  
  70. }  
  71.   
  72. /*销毁一个栈*/  
  73. void DestroyStack(Stack *ps)  
  74. {  
  75.     if(IsEmpty(ps)!=1)  
  76.         ClearStack(ps);  
  77.     free(ps);  
  78. }  
  79.   
  80. /*把栈置空*/  
  81. void ClearStack(Stack *ps)  
  82. {  
  83.     while(IsEmpty(ps)!=1)  
  84.     {  
  85.         Pop(ps,NULL);  
  86.     }  
  87. }  
  88.   
  89. /*遍历栈并访问visit函数 */  
  90. void StackTraverse(Stack *ps,void (*visit)())  
  91. {  
  92.     PNode p = ps->top;  
  93.     int i = ps->size;  
  94.     while(i--)  
  95.     {  
  96.         visit(p->data);  
  97.         p = p->down;  
  98.     }  
  99. }  


测试部分Test.c

  1. #include"Stack.h"  
  2. #include<stdio.h>  
  3. void print(Item i)  
  4. {  
  5.     printf("该节点元素为%d\n",i);  
  6. }  
  7. main()  
  8. {  
  9.     Stack *ps = InitStack();  
  10.     int i,item;  
  11.   
  12.     printf("0-9依次入栈并输出如下:\n");  
  13.     for(i=0;i<10;i++)  
  14.     {  
  15.         Push(ps,i);  
  16.         GetTop(ps,&item);  
  17.         printf("%d ",item);  
  18.     }  
  19.       
  20.     printf("\n从栈顶到栈顶遍历并对每个元素执行print函数:\n");  
  21.     StackTraverse(ps,print);  
  22.   
  23.     printf("栈中元素依次出栈并输出如下:\n");  
  24.     for(i=0;i<10;i++)  
  25.     {  
  26.         Pop(ps,&item);  
  27.         printf("%d ",item);  
  28.     }  
  29.       
  30.     ClearStack(ps);  
  31.     if(IsEmpty(ps))  
  32.         printf("\n将栈置空成功\n");  
  33.     DestroyStack(ps);  
  34.     printf("栈已被销毁\n");  
  35.           
  36. }  

 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
2月前
链式队列的实现
链式队列的实现
29 0
|
2月前
|
存储 NoSQL C语言
数据结构——顺序栈与链式栈的实现-2
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-2
|
2月前
|
存储 C语言
数据结构——顺序栈与链式栈的实现-1
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-1
|
12月前
|
存储
静态链表
静态链表
|
11月前
|
存储 C++
7.3 C/C++ 实现顺序栈
顺序栈是一种基于数组实现的栈结构,它的数据元素存储在一段连续的内存空间中。在顺序栈中,栈顶元素的下标是固定的,而栈底元素的下标则随着入栈和出栈操作的进行而变化。通常,我们把栈底位置设置在数组空间的起始处,这样在进行入栈和出栈操作时,只需要维护栈顶指针即可。
57 0
|
11月前
|
C++
7.4 C/C++ 实现链表栈
相对于顺序栈,链表栈的内存使用更加灵活,因为链表栈的内存空间是通过动态分配获得的,它不需要在创建时确定其大小,而是根据需要逐个分配节点。当需要压入一个新的元素时,只需要分配一个新的节点,并将其插入到链表的头部;当需要弹出栈顶元素时,只需要删除链表头部的节点,并释放其所占用的内存空间即可。由于链表栈的空间利用率更高,因此在实际应用中,链表栈通常比顺序栈更受欢迎。
67 0
动态链表和静态链表的实现
动态链表和静态链表的实现
顺序栈的实现
顺序栈的实现
68 0
顺序栈与链栈
栈:先进后出,后进先出,那么该如何创建一个栈呢,下面我们将讲述顺序栈与链栈的创建
49 0
顺序栈与链栈

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19