首页 > 编程语言 >代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈

代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈

时间:2023-08-04 22:22:17浏览次数:40  
标签:stIn 第十天 队列 随想录 pop int que empty

232.用栈实现队列

     卡哥建议:大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。

    题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html

     做题思路:

      记住栈和队列的原理,队列是先进先出,栈是先进后出。如果把1,2,3,放入队列,出来顺序还是 1,2,3;但是在栈中,放入顺序是 1,2,3,出来顺序是 3,2,1,所以可以考虑用两个栈,一个入的栈,一个出的栈。把入的栈中所有的元素弹出到出的栈里,再从出的栈中把元素弹出来。如果进栈和出栈都为空的话,说明模拟的队列为空了。

 

      代码:

 1 class MyQueue {
 2 public:
 3     stack<int> stIn; //入的栈 
 4     stack<int> stOut; //出的栈 
 5     /** Initialize your data structure here. */
 6     MyQueue() {
 7 
 8     }
 9     /** Push element x to the back of queue. */
10     void push(int x) { //入栈 
11         stIn.push(x);
12     }
13 
14     /** Removes the element from in front of queue and returns that element. */
15     int pop() { //出栈 
16         // 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
17         if (stOut.empty()) {
18             // 从stIn导入数据直到stIn为空
19             while(!stIn.empty()) {
20                 stOut.push(stIn.top());
21                 stIn.pop();
22             }
23         }
24         int result = stOut.top(); //出的栈的顶部元素就是队列的首部元素 
25         stOut.pop(); //把出的栈的元素全部弹出 
26         return result;
27     }
28 
29     /** Get the front element. */
30     int peek() { //返回队列首部的元素。
31         int res = this->pop(); // 直接使用已有的pop函数,获取从出的栈中弹出的元素,比如,1,2,3 
32         stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去,模拟队列,所以要再添加 
33         return res;
34     }
35 
36     /** Returns whether the queue is empty. */
37     bool empty() {
38         return stIn.empty() && stOut.empty();
39     }
40 };

 

225. 用队列实现栈

      卡哥建议:可以大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。 建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解

     题目链接/文章讲解/视频讲解:https://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html

     做题思路:

     不用像上个题用两个队列来做,可以用一个队列,比如,入栈顺序是 1,2,3,出栈顺序是 3,2,1;入队顺序是1,2,3,把 1,2出队;再把1,2入队,此时再把3出队,同理,其他元素类似,就实现了像栈先把3弹出........。

       代码:

 

 1 class MyStack {
 2 public:
 3     queue<int> que;
 4     /** Initialize your data structure here. */
 5     MyStack() {
 6 
 7     }
 8     /** Push element x onto stack. */
 9     void push(int x) {
10         que.push(x);
11     }
12     /** Removes the element on top of the stack and returns that element. */
13     int pop() {
14         int size = que.size();
15         size--;
16         while (size--) { // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部
17             que.push(que.front()); //que.front是队列的出队位置 
18             que.pop();
19         }
20         int result = que.front(); // 此时弹出的元素顺序就是栈的顺序了
21         que.pop();
22         return result;
23     }
24 
25     /** Get the top element. */
26     int top() {
27         return que.back(); //back是队列的入队位置 
28     }
29 
30     /** Returns whether the stack is empty. */
31     bool empty() {
32         return que.empty();
33     }
34 };

 

 

标签:stIn,第十天,队列,随想录,pop,int,que,empty
From: https://www.cnblogs.com/romantichuaner/p/17607046.html

相关文章

  • [代码随想录]Day09-栈与队列part01
    题目:232.用栈实现队列思路:因为go没有栈和队列的类型,直接自己写就行了。比较简单的实现,具体看代码中的注释。代码:typeMyQueuestruct{numbers[]int}funcConstructor()MyQueue{returnMyQueue{numbers:[]int{}}}func(this*MyQueue)Push(xint){......
  • 优先队列
    元素入队时间复杂度O(logn),查询O(1),总体排序时间复杂度O(logn),用于优化一些大数据范围的排序,具体用法如下:#include<bits/stdc++.h>usingnamespacestd;priority_queue<int,vector<int>,less<int>>q;//less<int>:和greater<int>相反structnode{inti,v;};pr......
  • 代码随想录算法训练营第六天|力扣454.四数相加II、力扣383.赎金信、力扣15.三数之和、
    四数相加II(力扣454.)前两个数组的值直接遍历,并将和存入map中,key为和,value为出现次数后两个数组再次遍历,在map中寻找是否存在0-(c+d),若存在,count+=valuefor(a:A){//遍历ABfor(b:B){map[a+b]++;}}//insert操作for(c:C){for(d:D){target=0-(c+d);if(map.containsKey(t......
  • 代码随想录算法训练营第四十五天| 503.下一个更大元素II 42. 接雨水
    503.下一个更大元素II 要求:数组是环,需要找到下一个最大的元素思路1:先作为直线遍历,然后没有的节点,放到首部,再找比他大的节点注意:头节点代码:1//要求:返回循环数组中下一个更大的数字步数2//思路:先不循环遍历,3//然后对每个-1节点,以他为起始,放到数组的开头,计算有几......
  • 代码随想录算法训练营第九天| 复习字符串和双指针法(看卡哥文章复习)
     KMP算法就是在一个字符串中寻找另一个子串,避免了“跳回下一个字符再重新匹配”,实现了在一次字符串的遍历过程中就可以匹配出子串。28. 实现 strStr()  (本题可以跳过)     卡哥建议:因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的......
  • 单调队列
    一个支持在队尾插入,队头和队尾删除的队列,整个队列呈单调性如果要求最大值则维护一个递减的单调队列,最小值则递增用deque写很方便(前几天用数组模拟队列代码调不出bug难受死了)例题 P1886滑动窗口思路:用一个deque,存点的序号(用于判断是否过期)和点的数字。每次新增加一个元素,都......
  • redis stream做轻量级消息队列的可行性
    背景对于消息数量很少的场景,尝试使用redisstream来做消息队列.为什么要用redis的stream,redis的其他数据结构可以吗?参考文章1:https://www.zhihu.com/question/43688764?sort=created参考文章2:https://www.cnblogs.com/williamjie/p/11201654.htmlredis有一些机制有队......
  • kratos项目中使用kafka实现延迟队列
    项目地址https://gitee.com/huoyingwhw/kratos_kafkaB站视频地址B站视频地址——kratos项目中使用kafka实现延迟队列......
  • 消息队列详解
    文章目录1、什么是消息队列2、消息队列特点3、消息队列的的传输模式4、常用的消息队列1、什么是消息队列消息队列一般简称为MQ(MessgesQueue),是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成,是在消息的传输过程中保存消息的容器。......
  • [代码随想录]Day07-字符串 part01
    题目:344.反转字符串思路:每次把最前面和最后面的交换位置即可strings库里没有反转的方法——这个反转是之后几个题的一个基础代码:双指针调换位置funcreverseString(s[]byte){l,r:=0,len(s)-1//最前面的元素,最后面的元素forl<r{s[l],s[......