用两个栈实现队列

先进后出第一个栈,然后就后进先出第二个栈,从而实现队列
用stack1作为输入栈接收新元素,stack2作为输出栈实现队头弹出,push操作直接将元素压入stack1;pop操作时,若stack2为空,就把stack1的元素逐个弹出并压入stack2,再弹出stack2的栈顶元素即可。

以下是代码解析:

    class Solution{public:

    //队尾插入:新元素直接入栈1

    void push(int node) {

        stack1.push(node);

    }
    //队头删除:栈2为空时转移栈1元素,再弹出栈2栈顶

    int pop() {

        if(stack2.empty()){

            while(!stack1.empty()){

                stack2.push(stack1.top());

                stack1.pop();

            }

        }

        int ans=stack2.top();

        stack2.pop();

        return ans;

    }

 private:

    stack<int> stack1; //输入栈:存新插入元素

    stack<int> stack2; //输出栈:存反转后元素,用于弹出队头};

该解法的空间复杂度为O(n),时间复杂度O(1)
全部评论

相关推荐

核心思路是先统计链表总长度,确定需要反转的组数,再逐组局部反转并重新连接,计算出需要反转的组数s&nbsp;=&nbsp;n/k;然后循环s次,每次对当前&nbsp;k&nbsp;个节点进行局部反转,反转后将当前组的首尾与前后部分重新连接,最后返回处理后的链表头。对应的代码解析如下:class&nbsp;Solution&nbsp;{public:ListNode*&nbsp;reverseKGroup(ListNode*&nbsp;head,&nbsp;int&nbsp;k)&nbsp;{if(!head&nbsp;||&nbsp;k&nbsp;==&nbsp;1)&nbsp;return&nbsp;head;&nbsp;//&nbsp;空链表或k=1无需反转ListNode*&nbsp;dummy&nbsp;=&nbsp;new&nbsp;ListNode(0);&nbsp;//&nbsp;虚拟头节点,简化头节点处理dummy-&gt;next&nbsp;=&nbsp;head;ListNode*&nbsp;cur&nbsp;=&nbsp;head;ListNode*&nbsp;pre&nbsp;=&nbsp;dummy;&nbsp;//&nbsp;记录上一组的尾节点ListNode*&nbsp;next&nbsp;=&nbsp;nullptr;ListNode*&nbsp;prev&nbsp;=&nbsp;nullptr;ListNode*&nbsp;temp&nbsp;=&nbsp;nullptr;&nbsp;//&nbsp;记录当前组反转前的头节点int&nbsp;n&nbsp;=&nbsp;0;while(cur&nbsp;!=&nbsp;nullptr)&nbsp;{n++;cur&nbsp;=&nbsp;cur-&gt;next;}cur&nbsp;=&nbsp;head;if(n&nbsp;==&nbsp;1)&nbsp;return&nbsp;head;&nbsp;//&nbsp;只有1个节点直接返回int&nbsp;s&nbsp;=&nbsp;n&nbsp;/&nbsp;k;&nbsp;//&nbsp;计算需要反转的组数while(s--)&nbsp;{for(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;k;&nbsp;i++)&nbsp;{if(i&nbsp;==&nbsp;0)&nbsp;temp&nbsp;=&nbsp;cur;&nbsp;//&nbsp;记录当前组反转前的头节点next&nbsp;=&nbsp;cur-&gt;next;cur-&gt;next&nbsp;=&nbsp;prev;&nbsp;//&nbsp;当前节点指向前一个反转节点prev&nbsp;=&nbsp;cur;cur&nbsp;=&nbsp;next;}pre-&gt;next&nbsp;=&nbsp;prev;temp-&gt;next&nbsp;=&nbsp;cur;pre&nbsp;=&nbsp;temp;&nbsp;//&nbsp;更新上一组的尾节点为当前组反转前的头节点prev&nbsp;=&nbsp;nullptr;&nbsp;//&nbsp;重置反转前驱指针}ListNode*&nbsp;newhead&nbsp;=&nbsp;dummy-&gt;next;delete&nbsp;dummy;&nbsp;//&nbsp;释放虚拟头节点,避免内存泄漏return&nbsp;newhead;}};该解法的时间复杂度为&nbsp;O&nbsp;(n),空间复杂度为&nbsp;O&nbsp;(1)。
点赞 评论 收藏
分享
11-23 14:11
已编辑
门头沟学院 Java
11.19&nbsp;一面1、自我介绍2、问了一下实习经历做的什么3、项目-&nbsp;项目经历挑一个最难的点说一说-&nbsp;为什么选择rocketMQ-&nbsp;缓存一致性(canal具体是怎么操作的)-&nbsp;会不会有超卖问题-&nbsp;限流流程4、八股-&nbsp;JVM内存管理(如何避免内存泄漏)-&nbsp;hashmap数据结构(为什么增加了红黑树)-&nbsp;synchronic原理、项目中有用到吗、使用的注意事项-&nbsp;线程池有用过吗,有什么注意事项-&nbsp;线程数为什么这么选择-&nbsp;慢SQL排查与解决-&nbsp;双亲委派模型(是什么、为什么这么设计)-&nbsp;spring怎么解决循环依赖5、Linux-&nbsp;查询线程的cpu占有率(列表、最高)-&nbsp;查找文件-&nbsp;编辑文件(小、大文本)6、微服务-&nbsp;feign和hystrix有了解吗-&nbsp;熔断有了解吗,它是为了解决什么问题7、网络-&nbsp;三次握手四次挥手减一次行不行8、ai相关-&nbsp;有了解过ai吗-&nbsp;提示词优化有了解吗-&nbsp;rag有了解过吗-&nbsp;数据分析数据处理方面有了解过吗(讲了numpy那些,都还很入门,汗流浃背了)-&nbsp;有没有学习过什么数据库之类的(讲了mnist手写数字数据库)这个数据库有什么实际应用场景吗9、编程题按层打印一棵树(写出大概率逻辑就行)10、反问总结:感觉自己知识面还是有点窄了,Linux部分没怎么答上来,ai部分也臭臭的,继续努力。还有就是回答的时候不够全面,有的平常看会了但答的时候还是漏了,还是多练吧面试官人很好,答不出来他也说没关系的,还会引导着说,反问的时候很诚恳的鼓励和建议,暖暖的11.21&nbsp;出结果
查看27道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务