• [C/C++] 数据结构 LeetCode:用队列实现栈


    题目描述:

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

    实现 MyStack 类:

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

    注意:

    • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize 和 is empty 这些操作。
    • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

    题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    功能实现思路:

    在实现这个题目之前得先完成队列的基本操作,可以参考文章:http://t.csdnimg.cn/3v2IZ

    1. 出栈 

    现在我们有两个队列,假设在第一个队列里依次入了1 2 3 4 5,另一个队列为空队列

    现在要出栈的话,应该把5出去,但是数据目前在队列里,出数据只能从队头出,所以可以把1 2 3 4依次出队列,并入到第二个队列中,此时就可以把5出去了,此时又是一个队列为空,另一个存着剩余的数据,再出栈的话,还按照这个方法即可

    1. int myStackPop(MyStack* obj) {
    2. //由于不知道哪个队列为空队列,可以采用假设法
    3. Queue* empty = &obj->queue1;
    4. Queue* nonempty=&obj->queue2;
    5. if(!QueueEmpty(&obj->queue1))
    6. {
    7. empty=&obj->queue2;
    8. nonempty=&obj->queue1;
    9. }
    10. while(QueueSize(nonempty)>1)
    11. {
    12. QueuePush(empty,QueueFront(nonempty));
    13. QueuePop(nonempty);
    14. }
    15. int top=QueueFront(nonempty);
    16. QueuePop(nonempty);
    17. return top;
    18. }

    总结:

    出栈操作相当于非空队列的队尾元素出队,此时需要把非空队列除最后一个元素之外的其他元素入队到空队列,然后出队最后一个队尾元素

    2.入栈

    入栈操作相当于在非空队列进行入队操作

    1. void myStackPush(MyStack* obj, int x) {
    2. if(!QueueEmpty(&obj->queue1))
    3. {
    4. QueuePush(&obj->queue1,x);
    5. }
    6. else
    7. {
    8. QueuePush(&obj->queue2,x);
    9. }
    10. }

    3.判空

    只要两个队列都没有元素就表示栈空

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

    4.返回栈顶元素

    即返回非空队列队尾元素

    1. int myStackTop(MyStack* obj) {
    2. if(!QueueEmpty(&obj->queue1))
    3. {
    4. return QueueTail(&obj->queue1);
    5. }
    6. else
    7. {
    8. return QueueTail(&obj->queue2);
    9. }
    10. }
    1. typedef int QDataType;
    2. typedef struct QueueNode {
    3. QDataType x;
    4. struct QueueNode* next;
    5. }Node;
    6. typedef struct Queue
    7. {
    8. Node* head;
    9. Node* tail;
    10. int size;
    11. }Queue;
    12. void QueueInit(Queue* ps)
    13. {
    14. assert(ps);
    15. ps->head = ps->tail = NULL;
    16. ps->size = 0;
    17. }
    18. void QueuePush(Queue* ps, QDataType x)
    19. {
    20. assert(ps);
    21. //创建新节点
    22. Node* newnode = (Node*)malloc(sizeof(Node));
    23. if (newnode == NULL)
    24. {
    25. perror("malloc");
    26. return;
    27. }
    28. newnode->next = NULL;
    29. newnode->x = x;
    30. //尾插
    31. if (ps->tail == NULL)
    32. {
    33. ps->head = ps->tail = newnode;
    34. }
    35. else
    36. {
    37. ps->tail->next = newnode;
    38. ps->tail = ps->tail->next;
    39. }
    40. ps->size++;
    41. }
    42. void QueuePop(Queue* ps)
    43. {
    44. assert(ps);
    45. assert(ps->head);
    46. if (ps->head->next == NULL)
    47. {
    48. ps->head = ps->tail = NULL;
    49. }
    50. else
    51. {
    52. Node* next = ps->head->next;
    53. free(ps->head);
    54. ps->head = next;
    55. }
    56. ps->size--;
    57. }
    58. bool QueueEmpty(Queue* ps)
    59. {
    60. assert(ps);
    61. return ps->tail == NULL;
    62. }
    63. QDataType QueueFront(Queue* ps)
    64. {
    65. assert(ps);
    66. assert(ps->head);
    67. return ps->head->x;
    68. }
    69. QDataType QueueTail(Queue* ps)
    70. {
    71. assert(ps);
    72. assert(ps->tail);
    73. return ps->tail->x;
    74. }
    75. int QueueSize(Queue* ps)
    76. {
    77. assert(ps);
    78. return ps->size;
    79. }
    80. void QueueDestory(Queue* ps)
    81. {
    82. assert(ps);
    83. Node* cur = ps->head;
    84. while (cur)
    85. {
    86. Node* next = cur->next;
    87. free(cur);
    88. cur = next;
    89. }
    90. ps->head=ps->tail = NULL;
    91. ps->size=0;
    92. }
    93. typedef struct {
    94. Queue queue1;
    95. Queue queue2;
    96. } MyStack;
    97. MyStack* myStackCreate() {
    98. MyStack* mystack=(MyStack*)malloc(sizeof(MyStack));
    99. QueueInit(&mystack->queue1);
    100. QueueInit(&mystack->queue2);
    101. return mystack;
    102. }
    103. void myStackPush(MyStack* obj, int x) {
    104. if(!QueueEmpty(&obj->queue1))
    105. {
    106. QueuePush(&obj->queue1,x);
    107. }
    108. else
    109. {
    110. QueuePush(&obj->queue2,x);
    111. }
    112. }
    113. int myStackPop(MyStack* obj) {
    114. Queue* empty = &obj->queue1;
    115. Queue* nonempty=&obj->queue2;
    116. if(!QueueEmpty(&obj->queue1))
    117. {
    118. empty=&obj->queue2;
    119. nonempty=&obj->queue1;
    120. }
    121. while(QueueSize(nonempty)>1)
    122. {
    123. QueuePush(empty,QueueFront(nonempty));
    124. QueuePop(nonempty);
    125. }
    126. int top=QueueFront(nonempty);
    127. QueuePop(nonempty);
    128. return top;
    129. }
    130. int myStackTop(MyStack* obj) {
    131. if(!QueueEmpty(&obj->queue1))
    132. {
    133. return QueueTail(&obj->queue1);
    134. }
    135. else
    136. {
    137. return QueueTail(&obj->queue2);
    138. }
    139. }
    140. bool myStackEmpty(MyStack* obj) {
    141. return QueueEmpty(&obj->queue1)&&QueueEmpty(&obj->queue2);
    142. }
    143. void myStackFree(MyStack* obj) {
    144. QueueDestory(&obj->queue1);
    145. QueueDestory(&obj->queue2);
    146. free(obj);
    147. }

  • 相关阅读:
    Python读取hbase数据库
    Redis 主从架构数据同步
    NOIP2023模拟15联测36 均分财产
    PNG怎么转成PDF格式?这两种方法一定要尝试一下
    std::shared_ptr(基础、仿写、安全性)
    3D生成式AI模型与工具
    使用mac自带VNC公网远程控制macOS
    (附源码)springboot宠物医院管理系统 毕业设计 180923
    win11安装jdk
    云存储架构框架设计 | 最佳实践
  • 原文地址:https://blog.csdn.net/m0_74910646/article/details/134493380