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


    题目描述:

    请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

    实现 MyQueue 类:

    • void push(int x) 将元素 x 推到队列的末尾
    • int pop() 从队列的开头移除并返回元素
    • int peek() 返回队列开头的元素
    • boolean empty() 如果队列为空,返回 true ;否则,返回 false

    说明:

    • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
    • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

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

    功能思路: 

    在实现本题前,需要先构建好栈的基本功能,可以参考:http://t.csdnimg.cn/Kha16

    1.出队列 和 入队列

    现在我们有两个栈,假设在第一个栈中依次入栈1 2 3 4 5,另一个为空栈

    现在要出队列的话,应该把1出队,所以需要把除了栈底元素的其他元素出栈并且入到第二个栈里,这时就可以将1出队,但是将数据导入另一个栈时,数据会倒过来

    如果要再次出队列的话,应该把2出队,就不需要把数据导一次了,直接栈顶出栈即可.

    若此时再入队6 7的话,可以直接把6 7入到第一个栈中,因为出栈可以直接再第二个栈中操作

    所以我们可以把将一个栈专门用来入数据,另一个栈专门用来出数据,每次出队之前先判断出数据的栈是否为空,如果出数据那个栈不为空的话,直接出数据即可,否则就将入数据的栈中的数据导入出数据的栈中,再出栈.

    2.返回队列开头元素

    如果出数据的栈不为空,栈顶元素即为队列开头元素,否则就需要将入数据的栈的元素导入出数据的栈中,在返回栈顶元素

    3.判空

    两个栈同时为空,说明队列为空

    参考代码:

    1. typedef int STDataType;
    2. typedef struct stack
    3. {
    4. int* a;
    5. int top;
    6. int capacity;
    7. }ST;
    8. void STInit(ST* ps)
    9. {
    10. assert(ps);
    11. ps->a = NULL;
    12. ps->capacity = 0;
    13. ps->top = 0; //top初始化位0,top的值可以表示栈元素的个数
    14. }
    15. void STPush(ST* ps, STDataType x)
    16. {
    17. assert(ps);
    18. //扩容
    19. if (ps->top == ps->capacity)
    20. {
    21. int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    22. STDataType* ret = (STDataType*)realloc(ps->a,sizeof(STDataType)*newcapacity);
    23. if (ret == NULL)
    24. {
    25. perror("realloc");
    26. return;
    27. }
    28. ps->a = ret;
    29. ps->capacity = newcapacity;
    30. }
    31. ps->a[ps->top] = x;
    32. ps->top++;
    33. }
    34. void STPop(ST* ps)
    35. {
    36. assert(ps);
    37. assert(ps->top);
    38. ps->top--;
    39. }
    40. STDataType STTop(ST* ps)
    41. {
    42. assert(ps);
    43. assert(ps->top);
    44. return ps->a[ps->top - 1];
    45. }
    46. bool STEmpty(ST* ps)
    47. {
    48. assert(ps);
    49. return ps->top == 0;
    50. }
    51. int STSize(ST* ps)
    52. {
    53. assert(ps);
    54. return ps->top;
    55. }
    56. void STDestroy(ST* ps)
    57. {
    58. assert(ps);
    59. free(ps->a);
    60. ps->a == NULL;
    61. ps->top = ps->capacity = 0;
    62. }
    63. typedef struct {
    64. ST Queuepush;
    65. ST Queuepop;
    66. } MyQueue;
    67. MyQueue* myQueueCreate() {
    68. MyQueue *obj=(MyQueue*)malloc(sizeof(MyQueue));
    69. STInit(&obj->Queuepush);
    70. STInit(&obj->Queuepop);
    71. return obj;
    72. }
    73. void myQueuePush(MyQueue* obj, int x) {
    74. STPush(&obj->Queuepush,x);
    75. }
    76. int myQueuePeek(MyQueue* obj) {
    77. if(STEmpty(&obj->Queuepop))
    78. {
    79. while(!STEmpty(&obj->Queuepush))
    80. {
    81. STPush(&obj->Queuepop,STTop(&obj->Queuepush));
    82. STPop(&obj->Queuepush);
    83. }
    84. }
    85. return STTop(&obj->Queuepop);
    86. }
    87. int myQueuePop(MyQueue* obj) {
    88. int front = myQueuePeek(obj);
    89. STPop(&obj->Queuepop);
    90. return front;
    91. }
    92. bool myQueueEmpty(MyQueue* obj) {
    93. return STEmpty(&obj->Queuepop)&&STEmpty(&obj->Queuepush);
    94. }
    95. void myQueueFree(MyQueue* obj) {
    96. STDestroy(&obj->Queuepop);
    97. STDestroy(&obj->Queuepush);
    98. free(obj);
    99. }

  • 相关阅读:
    欧拉图(Euler Graph)
    14_墨菲定律书摘
    服务器内存总量和内存条有差异是什么问题 103.239.244.X
    ZooKeeper的Linux端安装步骤(内含Java的Linux端安装)
    面向对象分析与设计好文章
    【学习总结】LSD-SLAM配置与运行记录
    【问题解决:配置】解决spring mvc项目 get请求 获取中文字符串参数 乱码
    从零实现ChatGPT:第一章构建大规模语言模型的数据准备
    任务系统之Jenkins子任务
    微擎模块 微乐居房产v3.0.9综合版小程序,美化小程序房源详情,增加底部菜单
  • 原文地址:https://blog.csdn.net/m0_74910646/article/details/134495056