当前位置:   article > 正文

数据结构之链栈(C语言版)_listack &s含义

listack &s含义

链栈--单链表实现栈

链栈中无栈顶指针,如何实现在栈顶操作,实现先进后出

直接在链表表头进行操作,链表表头相当于栈顶

入栈:头插。 出栈:删除首元结点 

定义链栈:.

以定义单链表的方式来定义链栈

即一个数据域

一个指针域

其中listack==sstack *

使用 listack 声明链栈中的结点指针,意在强调操作对象是栈;

使用 sstack* 声明链栈中的结点指针,意在强调操作对象是栈中的某个结点 

  1. typedef struct listackNode{//链栈结点
  2. int date;//链栈结点中元素
  3. struct listackNode* next;//指针
  4. }sstack,*listack;

初始化栈:

先创建一个栈s并且动态内存分配一块空间

再让头结点指向NULL

再返回s的地址

  1. listack initstack()
  2. {
  3. listack s=(listack)malloc(sizeof(sstack));
  4. s->next=NULL;
  5. return s;
  6. }

入栈函数:

链表结点个数可以动态调节,无需判满

先创建一个p结点

再将数据写入结点

之后再以单链表的形式进行头插

  1. void Pushh(listack s,int k)
  2. {
  3. //链表结点个数可以动态调整,无需判满
  4. //头插法插入结点,实现入栈
  5. sstack *p=(sstack*)malloc(sizeof(sstack));//p是待插入的新结点
  6. p->date =k;
  7. //头插法 插入p
  8. p->next =s->next;
  9. s->next =p;

出栈函数:

先判空

如果不为空则让p结点指向待删的首元结点

再让头结点指向p结点的下一个结点

p指向NULL

再free掉p结点

  1. void Popp(listack s)
  2. {
  3. //删除之前判空,还有没有的删
  4. if(s->next==NULL)
  5. {
  6. printf("栈空\n");//栈空报错,不能删除
  7. }
  8. else
  9. {
  10. sstack *p=s->next ;//让p指向待删除的首元结点
  11. s->next =p->next ;
  12. p->NULL;
  13. free(p);
  14. }
  15. }

读取栈顶元素:

先判定是否为栈空

如果不为空则

将首元结点的数据赋值给x

再打印出x

  1. //读取栈顶元素
  2. void gettop(listack s)
  3. {
  4. int x;
  5. //判空,还有没有的读取
  6. if(s->next==NULL)
  7. {
  8. printf("栈空\n");//栈空报错,不能删除
  9. }
  10. else
  11. {
  12. x=s->next->date;
  13. printf("%d\n",x);
  14. }
  15. }
  16. in

总代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. ///链栈--单链表实现栈///
  4. typedef struct listackNode{//链栈结点
  5. int date;//链栈结点中元素
  6. struct listackNode* next;//指针
  7. }sstack,*listack;
  8. //此处的listack与链表代码中的 linklist类似
  9. //listack==sstack *;
  10. //使用 listack 声明链栈中的结点指针,意在强调操作对象是栈;
  11. //使用 sstack* 声明链栈中的结点指针,意在强调操作对象是栈中的某个结点
  12. //链栈中无栈顶指针,如何实现在栈顶操作,实现先进后出
  13. //直接在链表表头进行操作,链表表头相当于栈顶
  14. //入栈:头插。 出栈:删除首元结点
  15. //---------------------------------------------------------------------
  16. //栈操作:初始化,判空,入栈(push),出栈(pop),读取栈顶元素(top)
  17. //以顺序栈为例子
  18. //初始化
  19. listack initstack()
  20. {
  21. listack s=(listack)malloc(sizeof(sstack));
  22. s->next=NULL;
  23. return s;
  24. }
  25. //入栈--对栈进行了修改,指针传递
  26. void Pushh(listack s,int k)
  27. {
  28. //链表结点个数可以动态调整,无需判满
  29. //头插法插入结点,实现入栈
  30. sstack *p=(sstack*)malloc(sizeof(sstack));//p是待插入的新结点
  31. p->date =k;
  32. //头插法 插入p
  33. p->next =s->next;
  34. s->next =p;
  35. }
  36. //出栈
  37. void Popp(listack s)
  38. {
  39. //删除之前判空,还有没有的删
  40. if(s->next==NULL)
  41. {
  42. printf("栈空\n");//栈空报错,不能删除
  43. }
  44. else
  45. {
  46. sstack *p=s->next ;//让p指向待删除的首元结点
  47. s->next =p->next ;
  48. free(p);
  49. }
  50. }
  51. //读取栈顶元素
  52. void gettop(listack s)
  53. {
  54. int x;
  55. //判空,还有没有的读取
  56. if(s->next==NULL)
  57. {
  58. printf("栈空\n");//栈空报错,不能删除
  59. }
  60. else
  61. {
  62. x=s->next->date;
  63. printf("%d\n",x);
  64. }
  65. }
  66. int main()
  67. {
  68. int x;
  69. listack s=initstack();
  70. Pushh(s,1);
  71. Pushh(s,2);
  72. Pushh(s,3);
  73. gettop(s);
  74. Popp(s);
  75. gettop(s);
  76. return 0;
  77. }

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

闽ICP备14008679号