代码随想录【day 10 栈与队列】| 232.用栈实现队列、 225. 用队列实现栈

  • 理论基础
  • LeetCode 232.用栈实现队列
    • 题目链接:232.用栈实现队列
    • 卡哥文解
    • 视频讲解
    • 解题思路(两个栈模拟队列)
    • 实现难点
    • 代码实现
  • LeetCode 225. 用队列实现栈
    • 题目链接:LeetCode225.用队列实现栈
    • 卡哥文解
    • 视频讲解
    • 解题思路(一个队列模拟栈)
    • 实现难点
    • 代码实现
  • day10总结复盘
    • 补充

理论基础

  • 栈和队列是STL(C++标准库)两个数据结构
  • 队列是先进先出
  • 栈是先进后出
  • 栈提供push和pop等接口,所有元素必须符合先进后出规则,栈不提供走访功能,也不提供迭代器(iterator)。
  • 栈的底层实现可以是vector,deque,list

Q1: STL中栈和队列不被归类为容器,而被归类为container adapter(容器适配器)
Q2: 三个最为普遍的STL版本为HP STL 、P.J.Plauger STL、SGI STL(SGI STL是开源软件,源码可读性甚高)
Q3: 常用的SGI STL 如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构


LeetCode 232.用栈实现队列

题目链接:232.用栈实现队列

卡哥文解

视频讲解

题目描述: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

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

解题思路(两个栈模拟队列)

1、假设所有操作都是有效的(例如一个空的队列不会调用pop或者peek操作)
2、使用两个栈(in入栈 out出栈)实现队列先进先出的特点 注:将 入栈里 所有元素都放到 出栈里
3、push数据:只要数据放进 入栈 stIn.push(x);
4、pop元素:出栈如果为空 就把入栈数据全部导入,再从 出栈弹出栈顶元素 result = stOut.top(); 如果输出栈不为空,直接从出栈弹出数据。
5、判断队列为空:入栈和出栈都为空

实现难点

1、栈的标准操作包括
初始化一个栈 stack< int> stIn;
push元素 将对象压入栈顶 stIn.push(x);
判断为空 stIn.empty()
获得栈顶元素 stIn.top()
弹出栈顶元素 stIn.pop();
返回栈中元素的个数 stIn.size();
2、peek()的实现中复用了pop() (具体实现思路为先调用pop() 再将弹出的元素添加回去)
全局函数内无法直接调用struct类型变量内的成员,必须传一个struct指针(this指针)
this->加上成员名 就是调用这个对象的成员

代码实现

class MyQueue {public:// 初始化 入栈 & 出栈stack<int> stIn;stack<int> stOut;MyQueue() {}void push(int x) {stIn.push(x);}int pop() {// 当stOut为空 再从stIn导入数据if(stOut.empty()){while(!stIn.empty()){stOut.push(stIn.top());stIn.pop();}}int result = stOut.top();stOut.pop();return result;}int peek() {int res = this->pop();stOut.push(res);return res;}bool empty() {return stIn.empty() && stOut.empty();}
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

LeetCode 225. 用队列实现栈

题目链接:LeetCode225.用队列实现栈

卡哥文解

视频讲解

  • 题目描述: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)
  • 实现 MyStack 类:
  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

解题思路(一个队列模拟栈)

  • 将队列头部元素(除最后一个元素外)重新添加到队列尾部

实现难点

  • C++ queue用法:只能访问queue的第一个和最后一个元素,只能在容器末尾添加新元素,只能从头部移除元素。
  • 移除第一个元素 que.pop();
  • 在尾部添加一个新的元素 que.push(x);
  • 访问第一个元素 que.front();
  • 访问最后一个元素 que.back()

代码实现

class MyStack {public:// 初始化 队列queue<int> que;MyStack() {}void push(int x) {que.push(x);}int pop() {// 将队列头部元素(除最后一个元素外)重新添加到队列尾部int size = que.size();size--;while(size--){que.push(que.front());que.pop();}int result = que.front();que.pop();return result;}int top() {return que.back();}bool empty() {return que.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

day10总结复盘

1、之前对于队列和栈的理解只停留在先进先出以及先进后出的层面,写完这两题利用代码实现了一些基本操作 加深了理解
2、需要用两个栈来模拟队列,而可以只用一个队列来模拟栈。


补充

操作系统中堆(heap)和栈(stack)都是指内存空间。

  • 不同的堆为按需申请、动态分配,例如C中的malloc函数和C++中的new操作。(例如:p1 = (char *)malloc(10); )
  • 堆基本上可以理解为当前可以使用的空闲内存,但是其申请和释放都要程序员进行代码管理。(如果使用后忘记释放,会造成所谓的内存泄漏问题)
  • 栈是程序运行时自动拥有的一小块内存,由编译器自动分配释放,存放函数的参数值、局部变量的值(int a;)当这个局部变量离开其作用域后,所占用的内存就会自动释放。
  • 栈的空间有限制,一旦局部变量申请过多(例如开了超大数组),或者函数调用太深(例如递归太多次)就会导致栈溢出。
  • 生长方向:堆生长(扩展)方向向上,向着内存地址增加的方向;栈生长(扩展)方向向下,向着内存地址减小的方向增长。
    参考文献
    https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
    https://zhuanlan.zhihu.com/p/88151799

代码随想录【day 10 栈与队列】| 232.用栈实现队列、 225. 用队列实现栈相关推荐

  1. 【代码随想录刷题记录】 232.用栈实现队列 、225. 用队列实现栈

    232.用栈实现队列 题目 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列支持的所有操作(push.pop.peek.empty): 实现 MyQueue 类: void push(int x ...

  2. 代码随想录第十天 | 225. 用队列实现栈 232.用栈实现队列(Java))

    232.用栈实现队列 class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue( ...

  3. Suzy找到实习了吗Day 10 | 栈和队列开始啦:232. 用栈实现队列,225. 用队列实现栈

    day10 python栈的实现 Python栈所需要的包 232. 用栈实现队列 思路 solution ?? 225. 用队列实现栈 思路 solution python栈的实现 Python中现 ...

  4. 代码随想录算法训练营Day12 栈与队列

    #代码随想录算法训练营 代码随想录算法训练营Day12 栈与队列| 239. 滑动窗口最大值 347.前 K 个高频元素 总结 239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑 ...

  5. 代码随想录算法训练Day11 LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)

    代码随想录算法训练Day11 | LeetCode232. 用栈实现队列(模拟):225.用队列实现栈(模拟):20. 有效的括号(栈应用):1047. 删除字符串中的所有相邻重复项(栈应用) 关于栈 ...

  6. 【代码随想录】【LeetCode】自学笔记07 - 栈和队列

    总结 基础补牢:[https://blog.csdn.net/tham_/article/details/44733101] 根据[http://c.biancheng.net/view/3354.h ...

  7. 【代码随想录】栈和队列

    用栈实现队列 在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出 ...

  8. 代码随想录算法训练营第十五天 | 层序遍历 10,226.翻转二叉树,101.对称二叉树 2

    代码随想录算法训练营第十五天 | 层序遍历 10,226.翻转二叉树,101.对称二叉树 2 1.1 层序遍历 10 1.1.1 102.二叉树的层序遍历 思路: 通过队列实现 class Solut ...

  9. 代码随想录35——贪心:860柠檬水找零、406根据身高重建队列、452用最少数量的箭引爆气球

    文章目录 1.860柠檬水找零 1.1.题目 1.2.解答 2.406根据身高重建队列 2.1.题目 2.2.解答 3.452用最少数量的箭引爆气球 3.1.题目 3.2.解答 1.860柠檬水找零 ...

最新文章

  1. oracle存储过程详解--游标 实现增、删、改、查的
  2. 我的世界java版gamemode指令_我的世界切换生存和创造模式的命令是什么?
  3. hibernate的Configuration类和SessionFactory接口
  4. JSP中base href=%=basePath%的作用
  5. 光流 | 光流算法对比:Farneback、Horn-Schunck、Lucas-Kanade、Lucas-Kanade derivative of Gaussian(附Matlab与C++代码)
  6. 如何利用css使PNG图片透明
  7. 【Tiny4412】制作最小文件系统脚本
  8. STL-hasmap源码
  9. 作为一个算法攻城狮,你训练的算法翻车了该怎么办?
  10. 高速行车12条技巧,每一条都关乎你的生命
  11. 老王带你理解算法复杂度O(1),O(N),O(N^2)
  12. 腾讯首度披露基础架构演进史:“海量之道”进化“生而为云”
  13. web项目接到请求之后执行sql特别慢_小米开源!SQL优化工具,人工智能帮你 Rewrite...
  14. OPPO Reno 2正式发布:主打4800万变焦四摄 售价2999元
  15. 线段树入门 (zz)
  16. nodejs实现redis ORM
  17. X window 概念及原理图
  18. PHP商城源码分销奖励/绑定关系设计
  19. Ubuntu20.04如何解决QQ闪退问题(亲测有效)
  20. CC2500 使用总结

热门文章

  1. curl: command not found解决方法
  2. 图像融合质量评价方法MSSIM、MS-SSIM、FS、Qmi、Qabf与VIFF(三)
  3. java位移运算真的比乘除运算快吗?
  4. 【概率论与统计学】最常用常考的6种概率计算 经验分享
  5. 2011年中国移动开发者大会11月3-4日与您相约北京
  6. 师太你就从了老衲吧——完整版本
  7. Android测试系列之Instrumented Unit Test-UiAutomator
  8. 向全业务融合计费平滑演进
  9. 网站UV 和 PR值 简介
  10. OpenCV + CPP 系列(廿九)点与多边形的关系