• [C语言]栈与队列——喵喵队,冲冲冲


    宝子,你不点个赞吗?不评个论吗?不收个藏吗?

    最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

    喵喵喵,你对我真的很重要。

    目录

    前言

    栈的实现

    队列

    队列的实现

    总结


    前言

    实践,实践,实践,多练几遍力扣,牛客的题。落实到脚下。


    栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

    压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

    出栈:栈的删除操作叫做出栈。出数据也在栈顶。

     Push:进,Pop:出


    栈的实现

    栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

    1. #include "common.h"
    2. typedef int STDataType;
    3. typedef struct Satck
    4. {
    5. STDataType* _a;
    6. int _top;
    7. int _capacity;
    8. }Stack;
    9. void StackInit(Stack* ps, int n);
    10. void StackPush(Stack* ps, STDataType x);
    11. void StackPop(Stack* ps);
    12. STDataType StackTop(Stack* ps);
    13. int StackSize(Stack* ps);
    14. // 空 0 非空1
    15. int StackEmpty(Stack* ps);
    16. void StackTest();
    1. #include "Stack.h"
    2. void StackInit(Stack* ps, int n)
    3. {
    4. assert(ps);
    5. ps->_a = (STDataType*)malloc(sizeof(STDataType)*n);
    6. ps->_top = 0;
    7. ps->_capacity = n;
    8. }
    9. void StackPush(Stack* ps, STDataType x)
    10. {
    11. assert(ps);
    12. if (ps->_top == ps->_capacity)
    13. {
    14. ps->_a = (STDataType*)realloc(ps->_a, ps->_capacity * 2*sizeof(STDataType));
    15. ps->_capacity *= 2;
    16. }
    17. ps->_a[ps->_top] = x;
    18. ps->_top++;
    19. }
    20. void StackPop(Stack* ps)
    21. {
    22. assert(ps);
    23. if (ps->_top > 0)
    24. {
    25. ps->_top--;
    26. }
    27. }
    28. STDataType StackTop(Stack* ps)
    29. {
    30. assert(ps);
    31. return ps->_a[ps->_top - 1];
    32. }
    33. int StackSize(Stack* ps)
    34. {
    35. assert(ps);
    36. return ps->_top;
    37. }
    38. int StackEmpty(Stack* ps)
    39. {
    40. assert(ps);
    41. return ps->_top == 0 ? 0 : 1;
    42. }
    43. void StackTest()
    44. {
    45. Stack s;
    46. StackInit(&s, 3);
    47. StackPush(&s, 1);
    48. StackPush(&s, 2);
    49. StackPush(&s, 3);
    50. StackPush(&s, 4);
    51. while (StackEmpty(&s))
    52. {
    53. printf("top:%d\n", StackTop(&s));
    54. StackPop(&s);
    55. }
    56. }

    队列

    队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出

    FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头


    队列的实现

    队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

    1. #include "common.h"
    2. typedef int QUDataType;
    3. typedef struct QueueNode
    4. {
    5. QUDataType _data;
    6. struct QueueNode* _next;
    7. }QueueNode;
    8. typedef struct Queue
    9. {
    10. QueueNode* _front;
    11. QueueNode* _rear;
    12. }Queue;
    13. void QueueInit(Queue* q);
    14. void QueueDestory(Queue* q);
    15. void QueuePush(Queue* q, QUDataType x);
    16. void QueuePop(Queue* q);
    17. int QueueSize(Queue* q);
    18. int QueueEmpty(Queue* q);
    19. QUDataType QueueFront(Queue* q);
    20. QUDataType QueueBack(Queue* q);
    21. void QueueTest();
    1. #include "Queue.h"
    2. void QueueInit(Queue* q)
    3. {
    4. assert(q);
    5. q->_front = q->_rear = NULL;
    6. }
    7. void QueueDestory(Queue* q)
    8. {
    9. assert(q);
    10. QueueNode* cur = q->_front;
    11. while (cur)
    12. {
    13. QueueNode* next = cur->_next;
    14. free(cur);
    15. cur = next;
    16. }
    17. q->_front = q->_rear = NULL;
    18. }
    19. QueueNode* BuyQueueNode(QUDataType x)
    20. {
    21. QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode));
    22. node->_data = x;
    23. node->_next = NULL;
    24. return node;
    25. }
    26. void QueuePush(Queue* q, QUDataType x)
    27. {
    28. assert(q);
    29. if (q->_front == NULL)
    30. {
    31. q->_front = q->_rear = BuyQueueNode(x);
    32. }
    33. else
    34. {
    35. q->_rear->_next = BuyQueueNode(x);
    36. q->_rear = q->_rear->_next;
    37. }
    38. }
    39. void QueuePop(Queue* q)
    40. {
    41. if (q->_front)
    42. {
    43. QueueNode* next = q->_front->_next;
    44. free(q->_front);
    45. q->_front = next;
    46. if (q->_front == NULL)
    47. {
    48. q->_rear = NULL;
    49. }
    50. }
    51. }
    52. int QueueSize(Queue* q)
    53. {
    54. assert(q);
    55. int size = 0;
    56. QueueNode* cur = q->_front;
    57. while (cur)
    58. {
    59. ++size;
    60. cur = cur->_next;
    61. }
    62. return size;
    63. }
    64. int QueueEmpty(Queue* q)
    65. {
    66. assert(q);
    67. return q->_front == NULL ? 0 : 1;
    68. }
    69. QUDataType QueueFront(Queue* q)
    70. {
    71. assert(q);
    72. return q->_front->_data;
    73. }
    74. QUDataType QueueBack(Queue* q)
    75. {
    76. assert(q);
    77. return q->_rear->_data;
    78. }
    79. void QueueTest()
    80. {
    81. Queue q;
    82. QueueInit(&q);
    83. QueuePush(&q, 1);
    84. QueuePush(&q, 2);
    85. QueuePush(&q, 3);
    86. QueuePush(&q, 4);
    87. while (QueueEmpty(&q))
    88. {
    89. printf("fornt:%d\n", QueueFront(&q));
    90. QueuePop(&q);
    91. }
    92. }

    另外扩展了解一下,实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。


    20. 有效的括号

    给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

    有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. 左括号必须以正确的顺序闭合。
    3. 每个右括号都有一个对应的相同类型的左括号。

    示例 1:

    输入:s = "()"
    输出:true
    

    示例 2:

    输入:s = "()[]{}"
    输出:true
    

    示例 3:

    输入:s = "(]"
    输出:false

    有效的括号直达链接

    1. char pairs(char a) {
    2. if (a == '}') return '{';
    3. if (a == ']') return '[';
    4. if (a == ')') return '(';
    5. return 0;
    6. }
    7. bool isValid(char* s) {
    8. int n = strlen(s);
    9. if (n % 2 == 1) {
    10. return false;
    11. }
    12. int stk[n + 1], top = 0;
    13. for (int i = 0; i < n; i++) {
    14. char ch = pairs(s[i]);
    15. if (ch) {
    16. if (top == 0 || stk[top - 1] != ch) {
    17. return false;
    18. }
    19. top--;
    20. } else {
    21. stk[top++] = s[i];
    22. }
    23. }
    24. return top == 0;
    25. }

    总结

    一如既往,喵~


    宝子,你不点个赞吗?不评个论吗?不收个藏吗?

    最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

    喵喵喵,你对我真的很重要。

  • 相关阅读:
    李沐动手学深度学习V2-自然语言推断与数据集SNLI和代码实现
    树形DP杂题
    2022-06-26 数据结构-数组、链表、栈、队列
    23软考备考已开始,网络工程师知识点速记~(4)
    flink教程(2)-source- sink
    文件上传漏洞之安恒玄武盾的一些绕过方法技巧
    【云原生生态圈】:服务快速上云--Docker部署SpringBoot案例详解
    轻松连接远程服务器SecureCRT for Mac/Windows
    236. 二叉树的最近公共祖先
    DRM遇到的实际问题及领悟(1)
  • 原文地址:https://blog.csdn.net/ormstq/article/details/132372244