经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
用C语言实现链式栈介绍
来源:jb51  时间:2021/12/20 15:28:31  对本文有异议

堆栈的基本概念

堆栈是只能在一端增删元素的表结构,该位置称为栈顶堆栈的基本运算是压入和弹出,前者相当于插入,而后者则是删除最后插入的元素,形成后进先出的运算规则最后插入的元素在被弹出之前可以作为栈顶被外界访问从空栈中弹出,或向满栈中压入,都被认为是一种错误

常见的栈有顺序栈和链式栈

顺序栈

在这里插入图片描述

链式栈

在这里插入图片描述

- 链式栈的C代码实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /*节点的结构*/
  5. typedef struct node {
  6. struct node* pnode;
  7. int data;
  8. }node_t;
  9. /*栈的结构*/
  10. typedef struct stack {
  11. struct node* top;//栈顶指针
  12. int size;//栈中数据个数
  13. }stack_t;
  14. /*初始化栈*/
  15. void stack_init(stack_t* stk)
  16. {
  17. stk->top = NULL;
  18. stk->size = 0;
  19. }
  20. /*压栈操作*/
  21. void stack_push(stack_t* stk, int data)
  22. {
  23. node_t *node = malloc(sizeof(node_t));
  24. node->data = data;
  25. node->pnode = stk->top;
  26. stk->top = node;
  27. stk->size++;
  28. }
  29. /*弹栈:将栈中数据弹入buf*/
  30. void stack_pop(stack_t* stk, int buf[], int size)
  31. {
  32. for(int i = 0; i < size; ++i) {
  33. if(stk->size == 0) {
  34. printf("栈中数据已弹净!\n");
  35. break;
  36. }
  37. node_t* temp = stk->top;
  38. buf[i] = stk->top->data;
  39. stk->top = stk->top->pnode;
  40. stk->size--;
  41. free(temp);
  42. }
  43. }
  44. /*删除整个栈*/
  45. void stack_deinit(stack_t* stk)
  46. {
  47. while(stk->size || stk->top) {
  48. node_t* temp = stk->top;
  49. stk->top = stk->top->pnode;
  50. stk->size--;
  51. free(temp);
  52. }
  53. }
  54. /*从栈顶自上而下打印栈中所有数据*/
  55. void print_stack(stack_t* stk)
  56. {
  57. if(stk->size == 0) {
  58. printf("栈中无数据!\n");
  59. }
  60. for(node_t* node = stk->top;
  61. node; node = node->pnode) {
  62. printf("%d ",node->data);
  63. }
  64. printf("\n");
  65. }
  66.  
  67. /*测试代码*/
  68. #define N 30
  69. int main(void)
  70. {
  71. stack_t stack;
  72. int buf[N];
  73. stack_init(&stack);
  74. printf("开始压栈!\n");
  75. for(int i = 0; i < N; ++i) {
  76. stack_push(&stack, i);
  77. }
  78. print_stack(&stack);//打印栈中数据
  79. //stack_deinit(&stack);
  80. printf("开始弹栈!\n");
  81. stack_pop(&stack, buf, N);//弹栈
  82. print_stack(&stack);
  83. printf("取出的数据为:");
  84. for(int i = 0; i < sizeof(buf) /
  85. sizeof(buf[0]); ++i) {
  86. printf("%d ", buf[i]);
  87. }
  88. printf("\n");
  89. return 0;
  90. }

代码运行效果

在这里插入图片描述

到此这篇关于用C语言实现链式栈介绍的文章就介绍到这了,更多相关C语言链式栈内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号