当前位置:   article > 正文

数据结构之链栈_数据结构链栈

数据结构链栈

简介

链栈是一种基于链表结构实现的栈,栈是一种具有后进先出(LIFO)特性的数据结构,只允许在栈顶进行插入(入栈)和删除(出栈)操作。

链栈由节点构成,每个节点包含两部分:数据域和指针域。数据域存储实际的数据,指针域指向下一个节点。链栈没有固定的容量限制,可以动态地增加或减少节点,因此在内存利用上比顺序栈更加灵活。

链栈节点结构

  • 数据域:存储栈中的数据元素。
  • 指针域:指向下一个节点的指针。
  1. struct StackNode {
  2. DataType data; // 数据域,存储数据元素
  3. StackNode* next; // 指针域,指向下一个节点
  4. };

链栈结构

  • 头指针指向链栈的头节点(栈底),用于链栈的初始化。
  • 栈顶指针指向链栈的栈顶节点,表示当前栈顶元素的位置。
  1. struct LinkStack {
  2. StackNode* top; // 栈顶指针
  3. };

 链栈的基本操作

初始化操作

创建一个空链栈,并将栈顶指针置空。

  1. bool InitStack(LiStack &Li){
  2. Li=(Linknode *)malloc(sizeof(Linknode));//分配头节点
  3. if(Li==NULL){
  4. return false;
  5. }
  6. Li->next=NULL;
  7. return true;
  8. }

判空

  1. bool Empty(LiStack Li){
  2. if(Li->next==NULL){//头节点下一个为空
  3. return true;
  4. }
  5. return false;
  6. }

入栈

  1. bool InsertLiStack(LiStack &Li,int e){
  2. if(Li->next==NULL){//头节点下一个为空
  3. return false;
  4. }
  5. Linknode *s;
  6. s==(Linknode *)malloc(sizeof(Linknode));
  7. s->data=e;
  8. s->next=Li->next;
  9. Li->next=s;
  10. return true;
  11. }

出栈

  1. bool DeleteLiStack(LiStack &Li,int e){
  2. if(Li->next==NULL){//头节点下一个为空
  3. return false;
  4. }
  5. Linknode *s;
  6. s==(Linknode *)malloc(sizeof(Linknode));
  7. s->next=Li->next;
  8. e=s->next->data;
  9. Li->next=s->next;
  10. return true;
  11. }

获得栈顶元素 

  1. bool GetElem(LiStack Li,int &x){
  2. if(Li->next!=NULL){
  3. x=Li->next->data;
  4. return x;
  5. }
  6. return false;
  7. }

链栈小结

链栈的优点是可以动态地分配内存空间,不受固定容量的限制,但相应地会增加一定的内存开销。链栈适用于不确定栈大小的情况,或者在栈操作频繁、容量需求不断变化的场景下。

完整代码实现 

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct Linknode{
  4. int data;
  5. struct Linknode *next;
  6. } Linknode,*LiStack;
  7. //初始化一个链栈
  8. bool InitStack(LiStack &Li){
  9. Li=(Linknode *)malloc(sizeof(Linknode));//分配头节点
  10. if(Li==NULL){
  11. return false;
  12. }
  13. Li->next=NULL;
  14. return true;
  15. }
  16. //判空
  17. bool Empty(LiStack Li){
  18. if(Li->next==NULL){//头节点下一个为空
  19. return true;
  20. }
  21. return false;
  22. }
  23. //入栈
  24. bool InsertLiStack(LiStack &Li,int e){
  25. if(Li->next==NULL){//头节点下一个为空
  26. return false;
  27. }
  28. Linknode *s;
  29. s==(Linknode *)malloc(sizeof(Linknode));
  30. s->data=e;
  31. s->next=Li->next;
  32. Li->next=s;
  33. return true;
  34. }
  35. //出栈
  36. bool DeleteLiStack(LiStack &Li,int e){
  37. if(Li->next==NULL){//头节点下一个为空
  38. return false;
  39. }
  40. Linknode *s;
  41. s==(Linknode *)malloc(sizeof(Linknode));
  42. s->next=Li->next;
  43. e=s->next->data;
  44. Li->next=s->next;
  45. return true;
  46. }
  47. //获得栈顶元素
  48. bool GetElem(LiStack Li,int &x){
  49. if(Li->next!=NULL){
  50. x=Li->next->data;
  51. return x;
  52. }
  53. return false;
  54. }
  55. int main(){
  56. LiStack l;
  57. bool nool=InitStack(l);
  58. if(nool){
  59. printf("true");
  60. }
  61. else{
  62. printf("false");
  63. }
  64. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/905939?site
推荐阅读
相关标签
  

闽ICP备14008679号