当前位置:   article > 正文

C语言数据结构--栈 基本操作代码合集_c语言入栈

c语言入栈

概述

三段代码分别是栈的顺序存储,带头结点的链式存储,不带头结点的链式存储。

都包括着初始化、判空、进栈、建立栈表、出栈,读取栈顶元素、遍历操作,方便大家调试。

顺序存储

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 50
  4. typedef struct{ //栈的顺序存储类型
  5. int data[MaxSize]; //存放栈中元素
  6. int top; //栈顶指针
  7. }SqStack;
  8. void InitStack(SqStack &S)
  9. {
  10. S.top = -1; //初始化栈顶指针
  11. }
  12. bool StackEmpty(SqStack S) //判空操作
  13. {
  14. if(S.top == -1)
  15. return true;
  16. else
  17. return false;
  18. }
  19. bool Push(SqStack &S,int x) //进栈
  20. {
  21. if(S.top == MaxSize-1) //栈满报错
  22. return false;
  23. S.data[++S.top] = x; //注意入栈是指针先加一,再入栈
  24. return true;
  25. }
  26. SqStack CreateStack(SqStack &S)
  27. {
  28. int x = 0;
  29. scanf("%d",&x);
  30. while(x!=9999)
  31. {
  32. Push(S,x); //调用进栈函数
  33. scanf("%d",&x);
  34. }
  35. return S;
  36. }
  37. bool Pop(SqStack &S,int &x) //出栈
  38. {
  39. if(S.top == -1) //栈空报错
  40. return false;
  41. x=S.data[S.top--];
  42. printf("出栈元素为:%d\n",x);
  43. return true;
  44. }
  45. bool GetTop(SqStack S,int &x) //读取栈顶元素
  46. {
  47. if(S.top == -1)
  48. return false;
  49. x=S.data[S.top];
  50. return true;
  51. }
  52. void Print(SqStack S) //遍历
  53. {
  54. while(S.top != -1)
  55. {
  56. printf("%d ",S.data[S.top--]);
  57. }
  58. }
  59. int main()
  60. {
  61. int x = 0;
  62. SqStack S;
  63. InitStack(S);
  64. CreateStack(S); //创建栈
  65. Push(S,666); //再进一个元素
  66. Pop(S,x); //出栈,并用x返回栈顶元素
  67. Print(S);
  68. return 0;
  69. }

带头结点的链式存储

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct StackNode{
  4. int data;
  5. struct StackNode *next;
  6. }StackNode,*LiStack;
  7. void InitStack(LiStack &S) //带头结点的链栈初始化
  8. {
  9. S=(StackNode *)malloc(sizeof(StackNode));
  10. S->next=NULL;
  11. }
  12. bool StackEmpty(LiStack S) //判空
  13. {
  14. if(S->next==NULL)
  15. return true;
  16. else
  17. return false;
  18. }
  19. bool Push(LiStack &S,int x) //进栈
  20. {
  21. StackNode *p=S;
  22. StackNode *o;
  23. o=(StackNode *)malloc(sizeof(StackNode));
  24. o->data = x;
  25. o->next = p->next ;
  26. p->next = o;
  27. return true;
  28. }
  29. LiStack CreateStack(LiStack &S) //调用Push函数建立链栈
  30. {
  31. int x = 0;
  32. scanf("%d",&x);
  33. while(x!=9999)
  34. {
  35. Push(S,x);
  36. scanf("%d",&x);
  37. }
  38. return S;
  39. }
  40. bool Pop(LiStack &S,int &x) //出栈 ,用x返回出栈的值
  41. {
  42. StackNode *p = S;
  43. if(p->next ==NULL)
  44. return false;
  45. StackNode *D = p->next ;
  46. x = D->data ;
  47. p->next =D->next ;
  48. free(D);
  49. return true;
  50. }
  51. bool GetTop(LiStack S,int &x) //读取栈顶元素,并用x返回其值
  52. {
  53. StackNode *p=S;
  54. if(p->next == NULL)
  55. return false;
  56. x=p->next->data ;
  57. printf("栈顶元素X=%d\n",x);
  58. return true;
  59. }
  60. void Print(LiStack S) //遍历
  61. {
  62. StackNode *p = S->next;
  63. while(p!=NULL)
  64. {
  65. printf("%d ",p->data);
  66. p=p->next ;
  67. }
  68. }
  69. int main()
  70. {
  71. int x = 0;
  72. LiStack S; //声明
  73. InitStack(S); //初始化
  74. CreateStack(S); //创建
  75. // Push(S,666); //进栈
  76. // Pop(S,x); //出栈
  77. GetTop(S,x); //读取栈顶元素
  78. Print(S);
  79. return 0;
  80. }

不带头结点的链式存储

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct StackNode{
  4. int data;
  5. struct StackNode *next;
  6. }StackNode,*LiStack;
  7. void InitStack(LiStack &S) //初始化不带头结点的链栈
  8. {
  9. S=NULL;
  10. }
  11. bool StackEmpty(LiStack S) //判空
  12. {
  13. if(S==NULL)
  14. return true;
  15. else
  16. return false;
  17. }
  18. bool Push(LiStack &S,int x) //进栈
  19. {
  20. StackNode *N;
  21. N=(StackNode *)malloc(sizeof(StackNode));
  22. N->data = x;
  23. N->next = S; //注意这里头插法方式的不同之处
  24. S = N;
  25. return true;
  26. }
  27. LiStack CreateStack(LiStack &S) //创建栈
  28. {
  29. int x = 0;
  30. printf("请输入入栈函数:");
  31. scanf("%d",&x);
  32. while(x!=9999)
  33. {
  34. Push(S,x);
  35. scanf("%d",&x);
  36. }
  37. return S;
  38. }
  39. bool Pop(LiStack &S,int &x) //出栈
  40. {
  41. if(S==NULL)
  42. return false;
  43. StackNode *p=S;
  44. x=p->data ;
  45. S=p->next ;
  46. free(p);
  47. return true;
  48. }
  49. bool GetTop(LiStack S,int &x) //读取栈顶元素
  50. {
  51. if(S==NULL)
  52. return false;
  53. x=S->data ;
  54. printf("栈顶元素为:%d \n",x);
  55. return true;
  56. }
  57. void Print(LiStack S) //遍历
  58. {
  59. while(S!=NULL)
  60. {
  61. printf("%d ",S->data);
  62. S=S->next ;
  63. }
  64. }
  65. int main()
  66. {
  67. int x = 0;
  68. LiStack S;
  69. InitStack(S);
  70. CreateStack(S);
  71. // Push(S,666);
  72. //Pop(S,x);
  73. GetTop(S,x);
  74. Print(S);
  75. return 0;
  76. }

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

闽ICP备14008679号