• 232.用栈实现队列(LeetCode)


    思路

    思路:利用两个栈实现队列先进先出的特性,先将元素导入一个栈内

     

     模拟出队时,则将所有元素导入另一个栈内,此时元素顺序被反转过来,只需要取栈顶数据即可

     

     那我们就可以将两个栈的功能分开,一个专门入push,一个专门出pop。出数据时,如果popst为空,则将pushst的数据导入。

    假设pushst入了1234后,反转到popst后,pushst又入了56,这时也是可以的。因为先pop4次,将1 2 3 4依次出栈,popst为空,则再将56导入,再pop2次,以5 6依次出栈。最终依然是1 2 3 4 5 6先入先出的顺序。

     

    实现 

    实现: 因为C语言没有库可以现成使用,所以我们将写好的栈导入

     先创建MyQueue结构体包含两个栈结构体。再malloc动态申请MyQueue结构体的空间,最后将两个栈传入初始化函数,进行初始化(记得要加上&取地址符号) 

     

    入队过程 ,我们把数据全部导入pushst栈内即可

     

    因为peek的功能比较简单,只用返回队列开头元素,所以我们先实现这个功能,等会实现pop再复用peek。 

     返回队列开头元素,我们的核心思路,先判断popst是否为空,如果为空,则循环将pushst中的元素全部导入popst注意:每取出一个栈顶元素,就将该元素pop出栈),最后获取popst的栈顶元素即可

     

     出队过程复用peek的功能,先用front保存队头元素,再将popst的栈顶元素弹出,最后返回front即可

     

     判断栈是否为空,只要当两个栈pushst和popst全为空时,队列才为空,返回true,否则返回false

     

     最后,释放队列空间,可能有人只写了最后一句也给过了,但是其实这是不对的。正确做法是,先将两个栈都销毁(销毁数组),再将MyQueue空间给释放掉,这样才不会造成内存泄漏

     

    完整代码附上:

    1. typedef int STDataType;
    2. typedef struct Stack
    3. {
    4. STDataType* a;
    5. int top;
    6. int capacity;
    7. }ST;
    8. //初始化
    9. void STInit(ST* pst);
    10. //销毁
    11. void STDestroy(ST* pst);
    12. //压栈
    13. void STPush(ST* pst, STDataType x);
    14. //出栈
    15. void STPop(ST* pst);
    16. //获取栈顶元素
    17. STDataType STTop(ST* pst);
    18. //检测栈是否为空
    19. bool STEmpty(ST* pst);
    20. //检测栈中有效元素个数
    21. int STSize(ST* pst);
    22. void STInit(ST* pst)
    23. {
    24. assert(pst);
    25. pst->a = NULL;
    26. pst->top = 0;//top指向栈顶元素的下一个位置
    27. pst->capacity = 0;
    28. }
    29. void STDestroy(ST* pst)
    30. {
    31. assert(pst);
    32. free(pst->a);
    33. pst->top = pst->capacity = 0;
    34. }
    35. void STPush(ST* pst, STDataType x)
    36. {
    37. assert(pst);
    38. if (pst->top == pst->capacity)
    39. {
    40. int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
    41. STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));
    42. if (tmp == NULL)
    43. {
    44. perror("realloc fail");
    45. return;
    46. }
    47. pst->a = tmp;
    48. pst->capacity = newCapacity;
    49. }
    50. pst->a[pst->top++] = x;
    51. }
    52. void STPop(ST* pst)
    53. {
    54. assert(pst);
    55. assert(!STEmpty(pst));
    56. pst->top--;
    57. }
    58. STDataType STTop(ST* pst)
    59. {
    60. assert(pst);
    61. assert(!STEmpty(pst));
    62. return pst->a[pst->top - 1];
    63. }
    64. bool STEmpty(ST* pst)
    65. {
    66. assert(pst);
    67. return pst->top == 0;
    68. }
    69. int STSize(ST* pst)
    70. {
    71. assert(pst);
    72. return pst->top;
    73. }
    74. typedef struct {
    75. ST pushst;
    76. ST popst;
    77. } MyQueue;
    78. MyQueue* myQueueCreate() {
    79. MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    80. if (obj == NULL)
    81. {
    82. perror("malloc fail");
    83. return NULL;
    84. }
    85. STInit(&obj->pushst);
    86. STInit(&obj->popst);
    87. return obj;
    88. }
    89. void myQueuePush(MyQueue* obj, int x) {
    90. STPush(&obj->pushst, x);
    91. }
    92. int myQueuePop(MyQueue* obj) {
    93. int front = myQueuePeek(obj);
    94. STPop(&obj->popst);
    95. return front;
    96. }
    97. int myQueuePeek(MyQueue* obj) {
    98. if (STEmpty(&obj->popst))
    99. {
    100. while (!STEmpty(&obj->pushst))
    101. {
    102. STPush(&obj->popst, STTop(&obj->pushst));
    103. STPop(&obj->pushst);
    104. }
    105. }
    106. return STTop(&obj->popst);
    107. }
    108. bool myQueueEmpty(MyQueue* obj) {
    109. return STEmpty(&obj->pushst)
    110. && STEmpty(&obj->popst);
    111. }
    112. void myQueueFree(MyQueue* obj) {
    113. STDestroy(&obj->pushst);
    114. STDestroy(&obj->popst);
    115. free(obj);
    116. }
    117. /**
    118. * Your MyQueue struct will be instantiated and called as such:
    119. * MyQueue* obj = myQueueCreate();
    120. * myQueuePush(obj, x);
    121. * int param_2 = myQueuePop(obj);
    122. * int param_3 = myQueuePeek(obj);
    123. * bool param_4 = myQueueEmpty(obj);
    124. * myQueueFree(obj);
    125. */

     

  • 相关阅读:
    聚名企服教您如何避免DNS劫持攻击?避免DNS劫持攻击方法有哪些
    flask-sqlalchemy库
    libusb开源库使用说明
    uni-app中使用computed解决了tab切换中data()值显示的异常
    Linux Shell 自动交互功能
    ASP.Net Core异步编程
    字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)
    50.集群节点维护—升级前重建索引
    Mysql高级篇学习总结9:创建索引、删除索引、降序索引、隐藏索引
    GEE开发之Modis_ET数据分析和获取
  • 原文地址:https://blog.csdn.net/2301_79188764/article/details/134394866