• [Leetcode]用队列实现栈


    1.用队列实现栈

    请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

    实现 MyStack 类:

    • void push(int x) 将元素 x 压入栈顶。
    • int pop() 移除并返回栈顶元素。
    • int top() 返回栈顶元素。
    • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

    目录

    题解:

    1.既是以队列(Queue)实现栈(Stack),那首先要实现队列的基础功能:

    2.基于队列(Queue)实现栈(Stack):

    出栈:

    入栈:

    获取栈顶元素:

    判空:

    3.注意:

    4..完整代码:


    题解:

    1.既是以队列(Queue)实现栈(Stack),那首先要实现队列的基础功能:

    初始化(QueueInit),出入队列(QueuePush)(QueuePop),判空(QueueEnpty)

    1. typedef int QueueDataType;
    2. typedef struct QueueData{
    3. QueueDataType Data;
    4. struct QueueData* Next;
    5. }QD;
    6. typedef struct{
    7. QD* head;
    8. QD* rear;
    9. }Queue;
    10. //初始化队列
    11. void QueueInit(Queue*tmp) {
    12. tmp->head = tmp->rear = NULL;
    13. }
    14. //判空
    15. bool QueueEmpty(Queue* tmp) {
    16. assert(tmp);
    17. return tmp->rear == NULL;
    18. }
    19. //入队列
    20. void QueuePush(Queue*tmp,QueueDataType x) {
    21. assert(tmp);
    22. QD* p = (QD*)malloc(sizeof(QD));
    23. if (p == NULL) {
    24. perror("Push:malloc");
    25. return;
    26. }
    27. p->Data = x;
    28. p->Next = NULL;
    29. if (tmp->rear == NULL) {
    30. tmp->head = tmp->rear = p;
    31. }
    32. else {
    33. tmp->rear->Next = p;
    34. tmp->rear = p;
    35. }
    36. }
    37. //出队列
    38. QueueDataType QueuePop(Queue*tmp) {
    39. assert(tmp);
    40. QueueDataType data;
    41. if (QueueEmpty(tmp)) {
    42. perror("QueuePop:NULL");
    43. }
    44. else if (tmp->head == tmp->rear) {
    45. data = tmp->head->Data;
    46. free(tmp->head);
    47. tmp->head = tmp->rear = NULL;
    48. }
    49. else {
    50. data = tmp->head->Data;
    51. QD* p = tmp->head;
    52. tmp->head = tmp->head->Next;
    53. free(p);
    54. p = NULL;
    55. }
    56. return data;
    57. }

    2.基于队列(Queue)实现栈(Stack):

    出栈:

    结合队列先进先出的特性,要满足栈后入先出,只需要两个队列互相配合(一个(a)队列接收(n个)入栈元素,当要出栈时只需要将(n-1个)元素出队列到另一个(b)队列中,最后将(a)队列中最后一个元素出队列即可)

    1. QueueDataType myStackPop(MyStack* obj) {
    2. if (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2)) {
    3. perror("StackPop:NULL");
    4. }
    5. if (QueueEmpty(&obj->queue2)) {
    6. while (obj->queue1.head != obj->queue1.rear) {
    7. QueuePush(&obj->queue2, QueuePop(&obj->queue1));
    8. }
    9. return QueuePop(&obj->queue1);
    10. }
    11. else {
    12. while (obj->queue2.head != obj->queue2.rear) {
    13. QueuePush(&obj->queue1, QueuePop(&obj->queue2));
    14. }
    15. return QueuePop(&obj->queue2);
    16. }
    17. }
    入栈:

    同理,入栈也需要两个队列配合,用一个队列接收元素,并标记该队列,另一个为空

    1. void myStackPush(MyStack* obj, QueueDataType x) {
    2. if (QueueEmpty(&obj->queue2)) {
    3. QueuePush(&obj->queue1, x);
    4. }
    5. else {
    6. QueuePush(&obj->queue2, x);
    7. }
    8. }
    获取栈顶元素:

    只需找到不为空的队列,返回该队列的队尾元素即可

    1. QueueDataType myStackTop(MyStack* obj) {
    2. if (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2)) {
    3. perror("StackTop:NULL");
    4. return 0;
    5. }
    6. if (QueueEmpty(&obj->queue2)) {
    7. return obj->queue1.rear->Data;
    8. }
    9. else {
    10. return obj->queue2.rear->Data;
    11. }
    12. }
    判空:

    判断构成栈的两个队列都为空,即栈为空

    1. bool myStackEmpty(MyStack* obj) {
    2. return (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2));
    3. }

    3.注意:

    实现队列和栈的过程中,想内存申请的空间,最后要记得释放,防止内存泄漏

    4..完整代码:

    1. #include<stdio.h>
    2. #include<stdbool.h>
    3. #include<assert.h>
    4. #include<stdlib.h>
    5. typedef int QueueDataType;
    6. typedef struct QueueData{
    7. QueueDataType Data;
    8. struct QueueData* Next;
    9. }QD;
    10. typedef struct{
    11. QD* head;
    12. QD* rear;
    13. }Queue;
    14. typedef struct{
    15. Queue queue1;
    16. Queue queue2;
    17. } MyStack;
    18. void QueueInit(Queue*tmp) {
    19. tmp->head = tmp->rear = NULL;
    20. }
    21. bool QueueEmpty(Queue* tmp) {
    22. assert(tmp);
    23. return tmp->rear == NULL;
    24. }
    25. MyStack* myStackCreate() {
    26. MyStack* stack = (MyStack*)malloc(sizeof(MyStack));
    27. QueueInit(&stack->queue1);
    28. QueueInit(&stack->queue2);
    29. return stack;
    30. }
    31. void QueuePush(Queue*tmp,QueueDataType x) {
    32. assert(tmp);
    33. QD* p = (QD*)malloc(sizeof(QD));
    34. if (p == NULL) {
    35. perror("Push:malloc");
    36. return;
    37. }
    38. p->Data = x;
    39. p->Next = NULL;
    40. if (tmp->rear == NULL) {
    41. tmp->head = tmp->rear = p;
    42. }
    43. else {
    44. tmp->rear->Next = p;
    45. tmp->rear = p;
    46. }
    47. }
    48. QueueDataType QueuePop(Queue*tmp) {
    49. assert(tmp);
    50. QueueDataType data;
    51. if (QueueEmpty(tmp)) {
    52. perror("QueuePop:NULL");
    53. }
    54. else if (tmp->head == tmp->rear) {
    55. data = tmp->head->Data;
    56. free(tmp->head);
    57. tmp->head = tmp->rear = NULL;
    58. }
    59. else {
    60. data = tmp->head->Data;
    61. QD* p = tmp->head;
    62. tmp->head = tmp->head->Next;
    63. free(p);
    64. p = NULL;
    65. }
    66. return data;
    67. }
    68. void myStackPush(MyStack* obj, QueueDataType x) {
    69. if (QueueEmpty(&obj->queue2)) {
    70. QueuePush(&obj->queue1, x);
    71. }
    72. else {
    73. QueuePush(&obj->queue2, x);
    74. }
    75. }
    76. QueueDataType myStackPop(MyStack* obj) {
    77. if (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2)) {
    78. perror("StackPop:NULL");
    79. }
    80. if (QueueEmpty(&obj->queue2)) {
    81. while (obj->queue1.head != obj->queue1.rear) {
    82. QueuePush(&obj->queue2, QueuePop(&obj->queue1));
    83. }
    84. return QueuePop(&obj->queue1);
    85. }
    86. else {
    87. while (obj->queue2.head != obj->queue2.rear) {
    88. QueuePush(&obj->queue1, QueuePop(&obj->queue2));
    89. }
    90. return QueuePop(&obj->queue2);
    91. }
    92. }
    93. QueueDataType myStackTop(MyStack* obj) {
    94. if (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2)) {
    95. perror("StackTop:NULL");
    96. return 0;
    97. }
    98. if (QueueEmpty(&obj->queue2)) {
    99. return obj->queue1.rear->Data;
    100. }
    101. else {
    102. return obj->queue2.rear->Data;
    103. }
    104. }
    105. bool myStackEmpty(MyStack* obj) {
    106. return (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2));
    107. }
    108. void myStackFree(MyStack* obj) {
    109. QD* cur = obj->queue1.head;
    110. while (cur) {
    111. QD* tmp = cur;
    112. cur = cur->Next;
    113. free(tmp);
    114. tmp = NULL;
    115. }
    116. cur = obj->queue2.head;
    117. while (cur) {
    118. QD* tmp = cur;
    119. cur = cur->Next;
    120. free(tmp);
    121. tmp = NULL;
    122. }
    123. }

  • 相关阅读:
    企业微信自建应用手动授权,获取用户详细信息
    【目标检测】50、YOLOX | 回归 anchor-free 的 YOLO 依然能打!
    POJ 2155 Matrix 树状数组
    【机器学习】无监督学习中的基于内容过滤算法
    Java——》synchronized锁粗化&锁消除
    linux线程创建等待及退出总结
    S4.2.4.5 Fast Training Sequence (FTS)
    Gen-AI时代天下英雄谁主沉浮?赛场见!卷起来!
    如果有10个词,我想从中取3个词,然后把所有的10选3的可能统计记录下来,该怎么做?...
    基于粒子群优化算法的BP神经网络预测模型(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/lzh20040919/article/details/137916726