• 数据结构:栈、队列、排序、 算法的复杂度


    一、栈和队列
    栈和队列都是对结点操作位置有要求的特殊线性表
    栈(先进后出)----->子弹入膛
    队列(先进先出)----->食堂排队
    二、栈(数据结构
    1.概念
        线性表的插入(压栈)和删除(出栈)都只能在同一个端点进行,不能在其他位置,这样的结构称之为栈
    2.分类
        顺序栈、链式栈(带头结点的单向不循环链表)
    3.特性
        后进先出,一端是完全封死的,只有另外一端是用来控制和插入的,所以说,最先进来的结点肯定是最后出去的
    4.链式栈(stack)
        其实就是一个头插头删或者尾插尾删的链表
    三、链式栈的设计和创建

    1. 1.设计:
    2. typedef int SElemType_t;
    3. //数据结点
    4. struct node
    5. {
    6.     SElemType_t data;
    7.     struct node *next;
    8. };
    9. //链式栈的管理结构体(头结点)
    10. struct list_stack
    11. {
    12.         struct node *stack;//保存首结点的地址
    13.         int size;//栈结构体中元素的个数(结点个数)
    14. };
    15. struct list_stack *managerStack;
    16. //2.初始化栈
    17. bool init_stack()
    18. {
    19.     //1)申请栈管理结构体的内存空间
    20.     managerStack=malloc(sizeof(struct list_stack));
    21.     if(managerStack==NULL)
    22.     {
    23.         printf("malloc managerStack error\n");
    24.         return false;
    25.     }
    26.     //2)初始化
    27.     managerStack->size=0;
    28.     managerStack->stack=NULL;
    29.     return true;
    30. }
    31. //3.入栈(压栈)
    32. bool push(SElemType_t inputData)
    33. {
    34.     //1、申请栈元素的结点的内存空间
    35.     struct node *newNode=malloc(sizeof(struct node));
    36.     if(newNode==NULL)
    37.     {
    38.         printf("malloc newNode error\n");
    39.         return false;
    40.     }
    41.     //2、初始化
    42.     newNode->data=inputData;
    43.     newNode->next=NULL;
    44.     //3、插入
    45.     if(managerStack->stack==NULL)//从无到有
    46.     {
    47.         managerStack->stack=newNode;
    48.     }
    49.     else//(由少到多)(头插)
    50.     {
    51.         newNode->next=managerStack->stack;
    52.         //更新首结点
    53.         managerStack->stack=newNode;
    54.     }
    55.     //栈元素+1
    56.     managerStack->size++;
    57.     return true;
    58. }
    59. bool isEmpty()
    60. {
    61.     return managerStack->size==0;
    62. }
    63. //出栈--删除(头删)
    64. bool pop(SElemType_t *outData)
    65. {
    66.     //1、先判断当前有没有栈元素
    67.     if(isEmpty())
    68.         return false;
    69.     //2、先获取出栈的数据
    70.     *outData=managerStack->stack->data;
    71.     //先定义一个临时的指针存储当前删除结点的地址
    72.     struct node*delNode=managerStack->stack;
    73.     //更新首结点
    74.     managerStack->stack=delNode->next;
    75.     //释放
    76.     free(delNode);
    77.     //size--
    78.     managerStack->size--;
    79.     return true;
    80. }
    81. //销毁栈
    82. void destory_stack()
    83. {
    84.     if(managerStack==NULL)
    85.         return;
    86.     //1.遍历所有的结点,每个点都删除
    87.     struct node *p=managerStack->stack;
    88.     struct node *pnext=NULL;
    89.     while(p)
    90.     {
    91.         pnext=p->next;
    92.         free(p);
    93.         p=pnext;
    94.     }
    95.     //2.释放头结点(栈管理结构体)
    96.     free(managerStack);
    97.     managerStack=NULL;
    98. }

    demo.c

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <stdbool.h>
    4. typedef int SElemType_t;
    5. struct node{
    6. SElemType_t data;
    7. struct node *next;
    8. };
    9. struct list_stack
    10. {
    11. struct node *stack;
    12. int size;
    13. };
    14. struct list_stack *managerStack;
    15. bool init_stack()
    16. {
    17. managerStack = malloc(sizeof(struct list_stack));
    18. if(managerStack == NULL)
    19. {
    20. printf("malloc managerStack error\n");
    21. return false;
    22. }
    23. managerStack->size = 0;
    24. managerStack->stack = NULL;
    25. return true;
    26. }
    27. bool push(SElemType_t inputData)
    28. {
    29. struct node *newNode = malloc(sizeof(struct node));
    30. if(newNode==NULL)
    31. {
    32. printf("malloc newNode error\n");
    33. return false;
    34. }
    35. newNode->data = inputData;
    36. newNode->next = NULL;
    37. if(managerStack->stack == NULL)
    38. {
    39. managerStack->stack = newNode;
    40. }
    41. else
    42. {
    43. newNode->next = managerStack->stack;
    44. managerStack->stack = newNode;
    45. }
    46. managerStack->size++;
    47. return true;
    48. }
    49. bool isEmpty()
    50. {
    51. return managerStack->size==0;
    52. }
    53. //出栈--删除(头删)
    54. bool pop(SElemType_t *outData)
    55. {
    56. //1、先判断当前有没有栈元素
    57. if(isEmpty())
    58. return false;
    59. //2、先获取出栈的数据
    60. *outData=managerStack->stack->data;
    61. //先定义一个临时的指针存储当前删除结点的地址
    62. struct node*delNode=managerStack->stack;
    63. //更新首结点
    64. managerStack->stack=delNode->next;
    65. //释放
    66. free(delNode);
    67. //size--
    68. managerStack->size--;
    69. return true;
    70. }
    71. //销毁栈
    72. void destory_stack()
    73. {
    74. if(managerStack==NULL)
    75. return;
    76. //1.遍历所有的结点,每个点都删除
    77. struct node *p=managerStack->stack;
    78. struct node *pnext=NULL;
    79. while(
  • 相关阅读:
    MyBatis 查询数据库
    figma都有哪些小技巧,分享3个给你
    浅谈EDR绕过
    【备考网络工程师】如何备考2023年网络工程师之上午常见考点篇(上)
    产品经理访谈 | 第五代验证码的创新与背景
    2.1.1+2.1.3进程的概念、组成、特征
    freeswitch sofia协议栈调试
    使用el-tree实现懒加载、请求接口的检索依次展开
    大数据必学Java基础(四十四):接口讲解
    树形DP()
  • 原文地址:https://blog.csdn.net/weixin_48102054/article/details/126874503