当前位置:   article > 正文

LeetCode 232.用栈实现队列(详解) (๑•̌.•๑)

LeetCode 232.用栈实现队列(详解) (๑•̌.•๑)

题目描述:

解题思路: 

创建两个栈,一个用于入数据,一个用于出数据。分别是pushST和popST;

1.如果是入数据就直接入进pushST

2.如果是出数据,先检查popST中有无数据,如果有数据,就直接出。如果没数据,就将pushST中的数据放进popST中,再从popST中出数据。

当pushST中的数据入到popST时,数据是顺序的,刚好满足队列的条件,直接出

用c语言实现栈,没法直接引用,这里需要自己创建一个栈,在完成上述操作。如果还不会栈的小伙伴可以看看我的这篇博客 【数据结构】栈【详解】૮₍ ˃ ⤙ ˂ ₎ა-CSDN博客 

栈的实现:

  1. //栈的声明与定义
  2. typedef int STDataType;//定义栈中的数据类型
  3. struct Stack
  4. {
  5. STDataType* a;//用于指向后续开辟的空间
  6. int top; // 栈顶
  7. int capacity; // 容量,方便增容
  8. };
  9. //typedef struct Stack ST;
  10. typedef struct Stack Stack;
  11. //初始化栈
  12. void StackInit(Stack* pst);
  13. //摧毁栈
  14. void StackDestroy(Stack* pst);
  15. //入栈
  16. void StackPush(Stack* pst, STDataType x);
  17. //出栈
  18. void StackPop(Stack* pst);
  19. //返回栈顶元素
  20. STDataType StackTop(Stack* pst);
  21. // 空返回1 非空返回0
  22. //int StackEmpty(Stack* pst);
  23. //栈的判空操作
  24. bool StackEmpty(Stack* pst);
  25. //返回栈的大小
  26. int StackSize(Stack* pst);
  27. void StackInit(Stack* pst)
  28. {
  29. assert(pst);
  30. //pst->a = NULL;
  31. //pst->top = 0;
  32. //pst->capacity = 0;
  33. pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);
  34. pst->top = 0;
  35. pst->capacity = 4;
  36. }
  37. void StackDestroy(Stack* pst)
  38. {
  39. assert(pst);
  40. free(pst->a);
  41. pst->a = NULL;
  42. pst->capacity = pst->top = 0;
  43. }
  44. // 性质就决定在栈顶出入数据
  45. void StackPush(Stack* pst, STDataType x)
  46. {
  47. assert(pst);
  48. if (pst->top == pst->capacity)
  49. {
  50. STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType)*pst->capacity * 2);
  51. if (tmp == NULL)
  52. {
  53. printf("realloc fail\n");
  54. exit(-1); // 结束整个程序
  55. }
  56. pst->a = tmp;
  57. pst->capacity *= 2;
  58. }
  59. pst->a[pst->top] = x;
  60. pst->top++;
  61. }
  62. void StackPop(Stack* pst)
  63. {
  64. assert(pst);
  65. assert(!StackEmpty(pst));
  66. pst->top--;
  67. }
  68. STDataType StackTop(Stack* pst)
  69. {
  70. assert(pst);
  71. assert(!StackEmpty(pst));
  72. return pst->a[pst->top - 1];
  73. }
  74. // 空返回1 非空返回0
  75. //int StackEmpty(Stack* pst);
  76. bool StackEmpty(Stack* pst)
  77. {
  78. assert(pst);
  79. return pst->top == 0;
  80. }
  81. int StackSize(Stack* pst)
  82. {
  83. assert(pst);
  84. return pst->top;
  85. }

队列的实现(需要用到前面的栈): 

  1. //用栈定义队列,其中包含两个栈,用于入数据和出数据
  2. typedef struct {
  3. Stack pushST;
  4. Stack popST;
  5. } MyQueue;
  6. /** Initialize your data structure here. */
  7. //队列的初始化
  8. MyQueue* myQueueCreate() {
  9. MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
  10. StackInit(&q->pushST);
  11. StackInit(&q->popST);
  12. return q;
  13. }
  14. /** Push element x to the back of queue. */
  15. //入队列
  16. void myQueuePush(MyQueue* obj, int x) {
  17. StackPush(&obj->pushST, x);
  18. }
  19. /** Removes the element from in front of queue and returns that element. */
  20. //出队列
  21. int myQueuePop(MyQueue* obj) {
  22. /*if(StackEmpty(&obj->popST))
  23. {
  24. while(!StackEmpty(&obj->pushST))
  25. {
  26. StackPush(&obj->popST, StackTop(&obj->pushST));
  27. StackPop(&obj->pushST);
  28. }
  29. }
  30. */
  31. int top = myQueuePeek(obj);
  32. StackPop(&obj->popST);
  33. return top;
  34. }
  35. /** Get the front element. */
  36. //判断栈内数据的情况,并返回栈顶元素
  37. int myQueuePeek(MyQueue* obj) {
  38. if (StackEmpty(&obj->popST))
  39. {
  40. while (!StackEmpty(&obj->pushST))
  41. {
  42. StackPush(&obj->popST, StackTop(&obj->pushST));
  43. StackPop(&obj->pushST);
  44. }
  45. }
  46. return StackTop(&obj->popST);
  47. }
  48. /** Returns whether the queue is empty. */
  49. //队列的判空
  50. bool myQueueEmpty(MyQueue* obj) {
  51. return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);
  52. }
  53. //摧毁队列
  54. void myQueueFree(MyQueue* obj) {
  55. StackDestroy(&obj->pushST);
  56. StackDestroy(&obj->popST);
  57. free(obj);
  58. }

 完整代码:

  1. //栈的声明与定义
  2. typedef int STDataType;//定义栈中的数据类型
  3. struct Stack
  4. {
  5. STDataType* a;//用于指向后续开辟的空间
  6. int top; // 栈顶
  7. int capacity; // 容量,方便增容
  8. };
  9. //typedef struct Stack ST;
  10. typedef struct Stack Stack;
  11. //初始化栈
  12. void StackInit(Stack* pst);
  13. //摧毁栈
  14. void StackDestroy(Stack* pst);
  15. //入栈
  16. void StackPush(Stack* pst, STDataType x);
  17. //出栈
  18. void StackPop(Stack* pst);
  19. //返回栈顶元素
  20. STDataType StackTop(Stack* pst);
  21. // 空返回1 非空返回0
  22. //int StackEmpty(Stack* pst);
  23. //栈的判空操作
  24. bool StackEmpty(Stack* pst);
  25. //返回栈的大小
  26. int StackSize(Stack* pst);
  27. void StackInit(Stack* pst)
  28. {
  29. assert(pst);
  30. //pst->a = NULL;
  31. //pst->top = 0;
  32. //pst->capacity = 0;
  33. pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);
  34. pst->top = 0;
  35. pst->capacity = 4;
  36. }
  37. void StackDestroy(Stack* pst)
  38. {
  39. assert(pst);
  40. free(pst->a);
  41. pst->a = NULL;
  42. pst->capacity = pst->top = 0;
  43. }
  44. // 性质就决定在栈顶出入数据
  45. void StackPush(Stack* pst, STDataType x)
  46. {
  47. assert(pst);
  48. if (pst->top == pst->capacity)
  49. {
  50. STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType)*pst->capacity * 2);
  51. if (tmp == NULL)
  52. {
  53. printf("realloc fail\n");
  54. exit(-1); // 结束整个程序
  55. }
  56. pst->a = tmp;
  57. pst->capacity *= 2;
  58. }
  59. pst->a[pst->top] = x;
  60. pst->top++;
  61. }
  62. void StackPop(Stack* pst)
  63. {
  64. assert(pst);
  65. assert(!StackEmpty(pst));
  66. pst->top--;
  67. }
  68. STDataType StackTop(Stack* pst)
  69. {
  70. assert(pst);
  71. assert(!StackEmpty(pst));
  72. return pst->a[pst->top - 1];
  73. }
  74. // 空返回1 非空返回0
  75. //int StackEmpty(Stack* pst);
  76. bool StackEmpty(Stack* pst)
  77. {
  78. assert(pst);
  79. return pst->top == 0;
  80. }
  81. int StackSize(Stack* pst)
  82. {
  83. assert(pst);
  84. return pst->top;
  85. }
  86. //用栈定义队列,其中包含两个栈,用于入数据和出数据
  87. typedef struct {
  88. Stack pushST;
  89. Stack popST;
  90. } MyQueue;
  91. /** Initialize your data structure here. */
  92. //队列的初始化
  93. MyQueue* myQueueCreate() {
  94. MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
  95. StackInit(&q->pushST);
  96. StackInit(&q->popST);
  97. return q;
  98. }
  99. /** Push element x to the back of queue. */
  100. //入队列
  101. void myQueuePush(MyQueue* obj, int x) {
  102. StackPush(&obj->pushST, x);
  103. }
  104. /** Removes the element from in front of queue and returns that element. */
  105. //出队列
  106. int myQueuePop(MyQueue* obj) {
  107. /*if(StackEmpty(&obj->popST))
  108. {
  109. while(!StackEmpty(&obj->pushST))
  110. {
  111. StackPush(&obj->popST, StackTop(&obj->pushST));
  112. StackPop(&obj->pushST);
  113. }
  114. }
  115. */
  116. int top = myQueuePeek(obj);
  117. StackPop(&obj->popST);
  118. return top;
  119. }
  120. /** Get the front element. */
  121. //判断栈内数据的情况,并返回栈顶元素
  122. int myQueuePeek(MyQueue* obj) {
  123. if (StackEmpty(&obj->popST))
  124. {
  125. while (!StackEmpty(&obj->pushST))
  126. {
  127. StackPush(&obj->popST, StackTop(&obj->pushST));
  128. StackPop(&obj->pushST);
  129. }
  130. }
  131. return StackTop(&obj->popST);
  132. }
  133. /** Returns whether the queue is empty. */
  134. //队列的判空
  135. bool myQueueEmpty(MyQueue* obj) {
  136. return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);
  137. }
  138. //摧毁队列
  139. void myQueueFree(MyQueue* obj) {
  140. StackDestroy(&obj->pushST);
  141. StackDestroy(&obj->popST);
  142. free(obj);
  143. }

博客到这里也是结束了,喜欢的小伙伴可以点赞加关注支持下博主,这对我真的很重要~~

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/671753
推荐阅读
相关标签
  

闽ICP备14008679号