找回密码
 立即注册
首页 业界区 科技 顺序栈的初始化、入栈、出栈、遍历

顺序栈的初始化、入栈、出栈、遍历

频鹏凶 2025-7-5 17:40:35
  1. /**
  2. * @file name : SeqStack.c
  3. * @brief     :  该程序通过堆内存实现顺序栈元素的初始化、入栈、出栈、遍历,另外为了提高可移植性,所以顺序栈中
  4. *               数据元素的类型为DataType_t,用户可以根据实际情况修改顺序表中元素的类型
  5. * @author    :  MINDSETT@163.com
  6. * @date      :  2025/7/5
  7. * @version   :  1.0
  8. * @note      :  None
  9. * CopyRight (c)  2025  MINDSETT@163.com  All Right Reserved
  10. */
  11. #include <stdbool.h>
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. //指定顺序栈中的元素的数据类型,用户可根据需要进行修改
  15. typedef int DataType_t;
  16. //构造一个实现顺序表的各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体
  17. typedef struct Sequence_Stack
  18. {
  19.     DataType_t *  bottom;    //栈底地址
  20.     unsigned int  size;      //栈容量
  21.     int           top;       //栈顶元素的下标
  22. }SeqStack_t;
  23. /**
  24. * @name    :  SeqStack_Create
  25. * @brief   :  创建一个顺序栈并进行初始化
  26. * @param   :  None
  27. * @retval  :  返回栈底地址
  28. * @date    :  2025/7/5
  29. * @version :  1.0
  30. * @note    :  None
  31. */
  32. SeqStack_t *SeqStack_Create(unsigned int size)
  33. {
  34.     //1.利用calloc对顺序栈的管理结构体申请一个内存
  35.     SeqStack_t *manager=(SeqStack_t *)calloc(1,sizeof(SeqStack_t));
  36.     if (NULL == manager){
  37.         perror("calloc memory for manager is failed\n");
  38.         exit(-1);
  39.     }
  40.     //2.对顺序栈管理结构体的所有元素进行初始化
  41.     manager->bottom=(DataType_t *)calloc(size,sizeof(DataType_t));
  42.     if (NULL == manager->bottom){
  43.         perror("calloc memory for Stack is failed\n");
  44.         exit(-1);
  45.     }
  46.     manager->size=size;
  47.     manager->top=-1;
  48.     return manager;
  49. }
  50. /**
  51. * @name    :  SeqStack_IsFull
  52. * @brief   :  判断顺序栈是否已满
  53. * @param   :  
  54. *              @manager:需要判断的顺序栈
  55. * @retval  :  已满返回true,未满返回false
  56. * @date    :  2025/7/5
  57. * @version :  1.0
  58. * @note    :  None
  59. */
  60. bool SeqStack_IsFull(SeqStack_t *manager)
  61. {
  62.     return (manager->top+1==manager->size)? true : false;
  63. }
  64. /**
  65. * @name    :  SeqStack_IsEmpty
  66. * @brief   :  判断顺序栈是否为空
  67. * @param   :  
  68. *              @manager:需要判断的顺序栈
  69. * @retval  :  为空返回true,不为空返回false
  70. * @date    :  2025/7/5
  71. * @version :  1.0
  72. * @note    :  None
  73. */
  74. bool SeqStack_IsEmpty(SeqStack_t *manager)
  75. {
  76.     return (-1==manager->top)? true : false;
  77. }
  78. /**
  79. * @name    :  SeqStack_Push
  80. * @brief   :  入栈
  81. * @param   :  
  82. *              @manager:需要操作的顺序栈
  83. *              @Data:需要压入的元素
  84. * @retval  :  已满返回true,未满返回false
  85. * @date    :  2025/7/5
  86. * @version :  1.0
  87. * @note    :  None
  88. */
  89. bool SeqStack_Push(SeqStack_t *manager,DataType_t Data)
  90. {
  91.     //判断顺序栈是否已满
  92.     if ( SeqStack_IsFull(manager) ){
  93.         printf("Sequence Stack is Full\n");
  94.         return false;
  95.     }
  96.     //如果顺序栈有剩余空间,则把新元素插入顺序栈的栈顶,并更新管理结构体中最后栈顶的元素下标
  97.     manager->bottom[++manager->top]=Data;
  98.     return true;
  99. }
  100. /**
  101. * @name    :  SeqStack_Pop
  102. * @brief   :  出栈
  103. * @param   :  
  104. *              @manager:需要操作的顺序栈
  105. *              @out:接收弹出的值
  106. * @retval  :  成功回true,失败返回false
  107. * @date    :  2025/7/5
  108. * @version :  1.0
  109. * @note    :  None
  110. */
  111. bool SeqStack_Pop(SeqStack_t *manager, DataType_t *out)
  112. {   
  113.     //判断顺序栈是否为空
  114.     if ( SeqStack_IsEmpty(manager) ){
  115.         printf("Sequence Stack is empty\n");
  116.         return false;
  117.     }
  118.     //删除一个元素,栈顶元素下标-1
  119.     *out=manager->bottom[manager->top--];
  120.     return true;
  121. }
  122. /**
  123. * @name    :  SeqStack_print
  124. * @brief   :  遍历顺序栈
  125. * @param   :  
  126. *              @manager:需要操作的顺序栈
  127. * @retval  :  成功回true,失败返回false
  128. * @date    :  2025/7/5
  129. * @version :  1.0
  130. * @note    :  None
  131. */
  132. void SeqStack_print(SeqStack_t *manager)
  133. {  
  134.      //判断顺序栈是否为空
  135.     if ( SeqStack_IsEmpty(manager) ){
  136.         printf("Sequence Stack is empty\n");
  137.         return;
  138.     }
  139.     //如果顺序栈不为空,则打印顺序栈的元素
  140.     for (int i=0;i<manager->top+1;i++){
  141.         printf("Element[%d]=%d\n",i,manager->bottom[i]);
  142.     }
  143.     printf("\n");
  144. }
复制代码
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册