用两个栈实现队列

先进后出第一个栈,然后就后进先出第二个栈,从而实现队列
用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)。
点赞 评论 收藏
分享
原文发布于个人博客&nbsp;liuhongwei&nbsp;dot&nbsp;org,访问以获得更好的阅读体验❤️Time&nbsp;is&nbsp;Tight一年多前,我开始学前端开发,时间虽然很遥远,我的技术水平却一直没能够让我自信地去面试。转眼到了大三,实习不可避免地被提上日程,终于在潦草匆忙地写了写项目后,修修改改简历开始了投递。You&nbsp;Miss&nbsp;100%&nbsp;of&nbsp;the&nbsp;Shots&nbsp;You&nbsp;Don't&nbsp;Take投递时,我并不觉得我的简历会拿到很多面试,所以选择了海投,也没有因为是大厂而不去投递,对我来说就是&nbsp;“不试试怎么会知道呢”&nbsp;或者&nbsp;“You&nbsp;miss&nbsp;100%&nbsp;of&nbsp;the&nbsp;shots&nbsp;you&nbsp;don't&nbsp;take“,在&nbsp;Boss&nbsp;直聘、实习僧、牛客上都是见到合适的岗位就打招呼/投递。前前后后总共投递了有一百多个岗位,三个软件中,直聘应该是面试最多的,其次是牛客。(这不太具有参考意义,面试的岗位,时间,简历水平都会影响约面情况,所以这可能是由于前端刚好缺人比较多,而直聘上正好是组内“直聘”)Lose&nbsp;Yourself始料不及的是约面试的公司主要是大厂,上周一(11&nbsp;月&nbsp;10&nbsp;日)晚上开始投递,次日就开始约面试了,周三(11&nbsp;月&nbsp;12&nbsp;日)就约了三场面试:第一周面试安排如上其中不乏大厂。第一个面试懂车帝,面试官真的很好,得知我第一次面试,一步步引导我表达自己的能力范围,最后也提醒需要多写技术文章和总结;字节的面试官也很好,不过我过于紧张,发挥得并不好,但是最后他也鼓励我,说我再积累一两个月应该会达到一个不错的水准,但也提醒基础不算好,最好从小厂面起,不然容易脏面评。我在第一天面完试后,觉得自己水平确实不够,立马取消了两个面试:滴滴和京东,不然周四和周五都有面试。面了头几场后,发觉面试确实需要技巧,也是需要某种“硬”实力,例如如何表达自己,如何描述一个技术,如何回答一些开放性的问题,其中也涉及八股的拷问如何讲解,如何展现自己的技术与能力。面试的结果不一定能衡量一个人的能力,但良好的面试技巧可以“提升”一个人的能力。取消两个面试痛定思痛后,决定精进自己的八股,并及时复盘面试。有意思的是懂车帝在当天晚上通知我过了一面,这无疑是给了我一个机会,我更需要抓住了。这里应播放《Lose&nbsp;Yourself》哈哈,近乎疯狂地背了两天八股,到了周末,我却看起了《浪潮之巅》…不过这都不重要了,我个人基础虽说不算好,也不至于太差,故所谓的八股不过是在我原有的知识基础上拓展,并没有存在知识点“脱节”的情况,加上&nbsp;AI&nbsp;的加持,理解知识的速度很快。接着到了周一周二,一场场面试袭来,每一场我都尽量努力复盘,面试的反馈还是比较明显的,我能感觉到面试官对我的评价会因表现而不同,特别是京东&nbsp;Young&nbsp;一面面试官反而说我的基础还不错,其实是刚好问得都会,也接触过相关八股。到了周三终于达到高潮,一天面了四场,其中百度一面二面仅间隔十来分钟,更是对心智的考验。如同修炼一般,最后达到一个相对熟练的状态,周三后面试前甚至没有太准备,也主要有我个人的懒惰了,以至于面完后,就想着就这样吧,实在不行就去中小厂积累经验。Fail&nbsp;as&nbsp;You&nbsp;Like在这如同期末周一般的面试周中,我却不会像以往期末周那样厌倦,是因为我对前端确实是感兴趣的,也能感觉到不同的面试官对于一个人能力的考察是多元的,并不只是看技术能力,我也享受在此过程中慢慢改进自己的过程,中间也意识到了很多很多自己的不足,特别是那些无法短期内改变的。面试过程中,有三个失败我觉得尤为关键,而正是这三个失败对我未来有很多的启发,希望有所启发:实习要趁早:如果能回到过去,我会在更早的时间去面试,去实习,倒不是说愿意早一些时候成为打工人一员,而是通过面试发现自己的能力不足在哪,体验一下真正工业界需要的能力有什么,以及自己追求的到底是什么。面试得准备:我真的是天真到头了,以为面试只是对自己能力的展现,并没有特别准备面试,对于八股,只是大概看了看面经,觉得可以回答个七七八八就觉得差不多,结果自然是亡羊补牢,为时略晚。这里有个小&nbsp;Tips,使用&nbsp;AI&nbsp;来拷问自己的简历,和用&nbsp;AI&nbsp;来问常考的八股,并进行相应的知识补充。能力需积累:百度二面的面试官和我交流的时候有些走神,我以为她在忙工作,后面她提到我最近的一次&nbsp;commit&nbsp;改的代码背后的原理,我才明白原来她在看我的&nbsp;GitHub&nbsp;的提交记录,我想她大概把所有代码提交都看了看吧。且不提面试过程中对于最直接的代码提交考察(aka&nbsp;日常积累的展现)我以为所有的思考积淀,无论是否技术相关,都会在面试中以某种方式展现。以上为抛砖引玉,下面推荐一些资源:Zack&nbsp;Wu&nbsp;的《校招面试不完全指南》Web&nbsp;Worker&nbsp;播客的校招系列CSDIY…
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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