• 数据结构(C语言)——栈的两种实现方式


    下面来介绍栈的两种实现方式:

    一、数组

    1. #include
    2. #include
    3. #define E int
    4. #define MAX_STACK 5
    5. //数据结构-栈(数组实现)
    6. typedef struct my_stack {
    7. E *sta;//栈大小为5
    8. int pos;//栈顶位置
    9. }my_stack;
    10. //初始化栈
    11. void initialise(my_stack* stack) {
    12. stack->sta = (E*)malloc(MAX_STACK * sizeof(E));
    13. if (stack->sta == NULL) return;
    14. stack->pos = -1;
    15. }
    16. //没满就返回假
    17. int is_full(my_stack* stack) {
    18. return (stack->pos == MAX_STACK-1);
    19. }
    20. //进栈
    21. int push_stack(my_stack* stack, E ele) {
    22. if (is_full(stack))return 0;
    23. stack->sta[++stack->pos] = ele;
    24. return 1;
    25. }
    26. //出栈
    27. E poll_stack(my_stack* stack) {
    28. if (stack->pos < 0)return 0;
    29. return stack->sta[stack->pos--];
    30. }
    31. int main() {
    32. my_stack stack;
    33. initialise(&stack);
    34. for (int i = 1; i <= 5; i++) {
    35. push_stack(&stack, 20*i);
    36. }
    37. for (int i = 0; i < 5; i++) {
    38. printf("%d\n", poll_stack(&stack));
    39. }
    40. return 0;
    41. }

    二、单链表

    相对于数组实现来说,单链表实现会稍微复杂点

    注:头文件和宏定义与上面一样

    1. typedef struct my_list {
    2. E element;
    3. struct my_stact* next;
    4. }List;
    5. typedef struct my_stact {
    6. List* list;
    7. int size;
    8. }my_stact;
    9. //初始化
    10. void initialise(my_stact* stack) {
    11. stack->list = NULL;
    12. stack->size = 0;
    13. }
    14. int is_full(my_stact* stack) {
    15. return (stack->size == MAX_STACK);
    16. }
    17. int push_stack(my_stact* stack, E ele) {
    18. if (is_full(stack)) return 0;
    19. List* tem = stack->list;
    20. int flag = 0;
    21. for (int i = 0; i < stack->size; i++) {
    22. if (i >= 1)
    23. tem = tem->next;
    24. flag++;
    25. }
    26. List* ptr = (List*)malloc(sizeof(List));//开辟空间
    27. if (ptr== NULL)return 0;//为空开辟失败
    28. ptr->next = NULL;//将新开辟的节点的下一节点指针置为空
    29. ptr->element = ele;
    30. if (flag == 0) {
    31. stack->list = ptr;
    32. stack->size++;
    33. return 1;
    34. }//首次开辟节点情况
    35. tem->next = ptr;//非第一个元素情况
    36. stack->size++;
    37. return 1;
    38. }
    39. E poll_stack(my_stact* stack) {
    40. if (stack->size == 0)return 0;
    41. List* tem = stack->list;
    42. for (int i = 0; i < stack->size; i++) {
    43. if(i>=1)
    44. tem = tem->next;//移动节点
    45. }
    46. E e = tem->element;
    47. stack->size--;
    48. free(tem);
    49. tem = NULL;
    50. return e;
    51. }
    52. int main() {
    53. my_stact stact;
    54. initialise(&stact);
    55. for (int i = 1; i <= 5; i++) {
    56. push_stack(&stact, 20*i);
    57. }
    58. for (int i = 0; i < 5; i++) {
    59. printf("%d\n", poll_stack(&stact));
    60. }
    61. return 0;
    62. }

     

  • 相关阅读:
    【虹科EMC测试系列】EMC测试中放大器的线性度验证
    [springMVC]9、处理json数据(@RequestBody,@ResponseBody)
    不可靠不重传的 tcp 新魔改
    【接口测试】POST请求提交数据的三种方式及Postman实现
    java 基于 SpringMVC+Mybaties+ easyUI 快递公司管理系统 的 设计与实现
    C++学习笔记(二十三)
    Docker的网络模式
    spark sql详解
    Python | Leetcode Python题解之第51题N皇后
    CF679A.Bear and Prime 100 (交互题)
  • 原文地址:https://blog.csdn.net/weixin_56821642/article/details/132866687