代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
1.代码随想录算法训练营第二天| LeetCode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 2.代码随想录算法训练营第三天| LeetCode 203.移除链表元素(同时也对整个单链表进行增删改查操作) 707.设计链表 206.反转链表 3.代码随想录算法训练营第一天| LeetCode 704. 二分查找、LeetCode 27. 移除元素4.代码随想录算法训练营第四天| LeetCode 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 142.环形链表II 5.代码随想录算法训练营第六天| LeetCode 242.有效的字母异位词 349. 两个数组的交集 1. 两数之和 6.代码随想录算法训练营第七天| LeetCode 454.四数相加II 15. 三数之和 18. 四数之和 7.代码随想录算法训练营第八天| LeetCode 344.反转字符串 541. 反转字符串II 151.翻转字符串里的单词 8.代码随想录算法训练营第九天| 复习字符串和双指针法(看卡哥文章复习)
9.代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
10.代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值11.代码随想录算法训练营第十三天| 239. 滑动窗口最大值 347.前 K 个高频元素 总结12.代码随想录算法训练营第十四天| 理论基础 递归遍历 迭代遍历 13.代码随想录算法训练营第十五天| 层序遍历 10 ,226.翻转二叉树 101.对称二叉树 2 14.代码随想录算法训练营第十六天| 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数15.代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 16.代码随想录算法训练营第十八天| 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树 17.代码随想录算法训练营第二十天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树 18.代码随想录算法训练营第二十一天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 19.代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 20.代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结21.代码随想录算法训练营第二十四天| 理论基础 77. 组合 22.代码随想录算法训练营第二十五天| 216.组合总和III 17.电话号码的字母组合23. 代码随想录算法训练营第二十七天| 39. 组合总和 40.组合总和II 131.分割回文串24. 代码随想录算法训练营第二十八天| 93.复原IP地址 78.子集 90.子集II 25.代码随想录算法训练营第二十九天| 491.递增子序列 46.全排列 47.全排列 II26. 代码随想录算法训练营第三十天| 51. N皇后 37. 解数独 总结 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 };
本文作者:银河小船儿
本文链接:https://www.cnblogs.com/romantichuaner/p/17607046.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步