当前位置:   article > 正文

链栈(入栈,出栈,遍历)

链栈

一、链栈概述

1.为什么要用链栈?

链式存储结构可以更好的避免栈上溢,因为顺序栈在定义结构体时需要定义最大值。

2.什么是链栈

栈的链式存储结构就是链栈,栈底就是链表的最后一个结点,而栈顶是链表的第一个结点,一个链栈可以由栈顶指针top唯一确定。

结构体的定义:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct Stack{
  4. int data;
  5. struct Stack *next;
  6. }*LStack;

二、基本操作

  1. //初始化链栈
  2. int Init(LStack &top){
  3. top=(Stack *)malloc(sizeof(Stack));
  4. if(top==NULL){
  5. printf("申请内存失败\n");
  6. return -1;
  7. }
  8. top->next=NULL;
  9. return 1;
  10. }
  11. //入栈
  12. int pushLstack(LStack &top,int e){
  13. LStack s;
  14. s=(Stack *)malloc(sizeof(Stack)); //申请结点
  15. if(s==NULL){
  16. printf("申请失败!");
  17. return -1;
  18. }
  19. s->data=e; //接收数据
  20. s->next=top->next; //类似尾插链表
  21. top->next=s;
  22. return 1;
  23. }
  24. //出栈
  25. int popLstack(LStack &top){
  26. LStack p;
  27. if(top->next==NULL){
  28. printf("栈空!");
  29. return 0;
  30. }
  31. p=top->next;
  32. top->next=p->next;
  33. printf("%d出栈\n",p->data);
  34. free(p);
  35. return 1;
  36. }
  37. //打印栈
  38. int printLstack(LStack top){
  39. if(top==NULL){
  40. printf("栈空!\n");
  41. return 0;
  42. }
  43. LStack p=top->next;
  44. while(p){
  45. printf("%d ",p->data);
  46. p=p->next;
  47. }
  48. }
  49. int main(){
  50. LStack L;
  51. Init(L); //初始化
  52. int n,a;
  53. printf("请输入进栈元素总数:");
  54. scanf("%d",&n);
  55. for(int i=1;i<=n;i++){
  56. printf("请输入第%d个元素:",i);
  57. scanf("%d",&a);
  58. pushLstack(L,a); //for循环进栈
  59. }
  60. printf("此时栈序列为:");
  61. printLstack(L); //打印
  62. printf("\n");
  63. popLstack(L); //出栈
  64. popLstack(L); //出栈
  65. printf("\n此时栈序列为:");
  66. printLstack(L); //打印
  67. }

运行结果:

 三、多重链栈

 多重链栈用到结构体数组这一个点。

结构体数组的定义:

1.先声明结构体,再去定义结构体数组

  1. struct 结构体名{
  2. 成员列表;
  3. };
  4. struct 结构体名 数组名[长度] ;

2.声明结构体的同时去定义结构体数组(结构体名可以省略).

  1. struct 结构体名{
  2. 成员列表;
  3. }数组名[长度];

结构体数组的引用:

1.变量类型引用。

 通过:结构数组名[ ].成员变量   来进行操作。

  1. struct Day{
  2. int year;
  3. int mouth;
  4. int day;
  5. }stu[2];
  6. Day[1].year=2022;
  7. Day[1].mouth=2;
  8. Day[1].day=7;

2.指针类型。

通过:结构数组名[ ]->成员变量来操作

  1. typedef struct Stack{
  2. int data;
  3. struct Stack *next;
  4. }*LStack;
  5. struct Stack *top[3];
  6. top[?]->next=?
  7. top[?]->data=?

多重链表操作:

  1. //多重入栈
  2. void pushs( Stack *top[3],int i,int x){ //i 代表要对哪一个栈进行入栈,x 是输入的值
  3. Stack *p=(Stack *)malloc(sizeof(Stack));
  4. p->data=x;
  5. p->next=top[i]->next;
  6. top[i]->next=p;
  7. }
  8. //多重出栈
  9. void pops( Stack *top[3],int i){
  10. if(top[i]->next==NULL){
  11. printf("栈空!");
  12. }
  13. Stack *p=top[i]->next;
  14. top[i]->next=p->next;
  15. printf("%d出栈 ",p->data);
  16. free(p);
  17. }
  18. //打印栈
  19. int prints( Stack *top[3],int i){
  20. if(top[i]==NULL){
  21. printf("栈空!\n");
  22. return 0;
  23. }
  24. LStack p=top[i]->next;
  25. while(p){
  26. printf("%d ",p->data);
  27. p=p->next;
  28. }
  29. }
  30. //main函数执行对于【1】栈的操作,其他的同理
  31. int main(){
  32. LStack top[3]; //声明
  33. Init(top[3]); //初始化
  34. pushs(&top[3],1,1); //1栈进 1-3
  35. pushs(&top[3],1,2);
  36. pushs(&top[3],1,3);
  37. printf("\n此时1栈的序列为:");
  38. prints(&top[3],1); //输出
  39. printf("\n");
  40. pops(&top[3],1); //1栈出栈
  41. printf("\n此时1栈的序列为:");
  42. prints(&top[3],1); //输出
  43. }

运行结果:(说明问题即可)

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

闽ICP备14008679号