当前位置:   article > 正文

链栈的定义、构建、入栈、出栈和取栈顶元素_链栈指针p如何定义

链栈指针p如何定义

一、链栈的定义:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define OK 1
  4. #define ERROR 0
  5. typedef int Status;
  6. typedef int ElemType;
  7. typedef struct StackNode
  8. {
  9. ElemType data;
  10. struct StackNode *next;
  11. }StackNode,*LinkStack;

二、初始化:

  1. Status InitStack(LinkStack &S)
  2. {//构建一个空栈,栈顶指针置空
  3. S=NULL;
  4. return OK;
  5. }

三、入栈:

算法步骤:

①为入栈元素e分配空间,用指针p指向;

②将新节点数据域置为e;

③将新节点插入栈顶;

④修改栈顶指针为p;

  1. Status Push(LinkStack &S,int e)
  2. {//在栈顶插入元素e;
  3. StackNode *p;
  4. p=new StackNode;//生成新的节点
  5. p->data=e;//将新的节点数据域置为e;
  6. p->next=S; //将新的节点插入栈顶;
  7. S=p;//修改栈顶指针p;
  8. return OK;
  9. }

四、出栈:

算法步骤:

①判断栈是否为空,若空则返回ERROR;

②将栈顶元素赋给e;

③临时保存栈顶元素空间,以备释放;

④修改栈顶指针,指向新的栈顶元素;

⑤释放原栈顶元素空间;

  1. Status Pop(LinkStack &S)
  2. {//删除S的栈顶元素,用e返回其值
  3. LinkStack p;
  4. p=new StackNode;
  5. int e;
  6. if(S==NULL) return ERROR;//栈空;
  7. e=S->data;//将栈顶元素赋给e;
  8. p=S;//用p临时保存栈顶元素空间,以备释放;
  9. S=S->next;//修改栈顶指针;
  10. delete p;//释放原栈顶元素空间;
  11. return e;
  12. }

五、取栈顶元素:

算法步骤:

①判断是否为空;

②直接返回栈顶值;

  1. Status GetTop(LinkStack &S)
  2. {//返回S的栈顶元素,不修改栈顶指针;
  3. if(S!=NULL)//栈非空;
  4. return S->data;//返回栈顶元素的值,栈顶指针不变;
  5. }

六、主函数:

  1. int main()
  2. {
  3. LinkStack S;
  4. InitStack(S);
  5. printf("请输入元素个数:");
  6. int x;
  7. scanf("%d",&x);
  8. int e;
  9. printf("请输入元素:");
  10. for(int i=0;i<x;i++){
  11. scanf("%d",&e);
  12. Push(S,e);//在栈顶插入元素e;
  13. }
  14. printf("栈顶元素为:%d",GetTop(S));//返回S的栈顶元素,不修改栈顶指针;
  15. printf("\n");
  16. printf("元素遍历:");
  17. for(int i=0;i<x;i++){
  18. printf("%d ",Pop(S));//删除S的栈顶元素,用e返回其值
  19. }
  20. return 0;
  21. }

七、完整代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define OK 1
  4. #define ERROR 0
  5. typedef int Status;
  6. typedef int ElemType;
  7. typedef struct StackNode
  8. {
  9. ElemType data;
  10. struct StackNode *next;
  11. }StackNode,*LinkStack;
  12. Status InitStack(LinkStack &S)
  13. {//构建一个空栈,栈顶指针置空
  14. S=NULL;
  15. return OK;
  16. }
  17. Status Push(LinkStack &S,int e)
  18. {//在栈顶插入元素e;
  19. StackNode *p;
  20. p=new StackNode;//生成新的节点
  21. p->data=e;//将新的节点数据域置为e;
  22. p->next=S; //将新的节点插入栈顶;
  23. S=p;//修改栈顶指针p;
  24. return OK;
  25. }
  26. Status Pop(LinkStack &S)
  27. {//删除S的栈顶元素,用e返回其值
  28. LinkStack p;
  29. p=new StackNode;
  30. int e;
  31. if(S==NULL) return ERROR;//栈空;
  32. e=S->data;//将栈顶元素赋给e;
  33. p=S;//用p临时保存栈顶元素空间,以备释放;
  34. S=S->next;//修改栈顶指针;
  35. delete p;//释放原栈顶元素空间;
  36. return e;
  37. }
  38. Status GetTop(LinkStack &S)
  39. {//返回S的栈顶元素,不修改栈顶指针;
  40. if(S!=NULL)//栈非空;
  41. {
  42. return S->data;//返回栈顶元素的值,栈顶指针不变;
  43. }
  44. }
  45. int main()
  46. {
  47. LinkStack S;
  48. InitStack(S);
  49. printf("请输入元素个数:");
  50. int x;
  51. scanf("%d",&x);
  52. int e;
  53. printf("请输入元素:");
  54. for(int i=0;i<x;i++){
  55. scanf("%d",&e);
  56. Push(S,e);//在栈顶插入元素e;
  57. }
  58. printf("栈顶元素为:%d",GetTop(S));//返回S的栈顶元素,不修改栈顶指针;
  59. printf("\n");
  60. printf("元素遍历:");
  61. for(int i=0;i<x;i++){
  62. printf("%d ",Pop(S));//删除S的栈顶元素,用e返回其值
  63. }
  64. return 0;
  65. }

八、运行结果:

 

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

闽ICP备14008679号