当前位置: 首页 > news >正文

代码随想录栈和队列专题二刷复盘day17

  • 栈和队列理论基础

    • 队列是先进先出,栈是先进后出

    • 栈和队列是STL里面的两个数据结构

      • 三个最为普遍的STL版本

        • 1.HP STL其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,且开放源代码

        • 2.P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。

        • 3.SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高。

    • 栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不能提供迭代器,不像是set或者map提供迭代器来遍历所有元素。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)

    • 栈的底层实现可以是vector,deque,list都是可以的,主要就是数组和链表的底层实现。常用的SGI STL,如果没有指定底层实现的化,默认是以deque为缺省情况下栈的底层结构,也可以指定vector为栈的底层实现

    • 队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器,SGI STL中队列一样是以deque为缺省情况下的底部结构,也可以指定list为其底层实现,所以STL队列也不被归类为容器,而被归类为container adapter(容器适配器)

 232.用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)

1.双栈实现队列:在push数据的时候,只要数据放进输入栈就可以,但是在pop的时候,输出站如果为空,就把进栈数据全部导入,再从栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了

class MyQueue {
public:stack<int> stIn;stack<int> stOut;MyQueue() {}// 将元素x推到队列的末尾void push(int x) {stIn.push(x);}// 从队列的开头移除并返回元素int pop() {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();*/

225.用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)

1.用两个队列实现:用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1

class MyStack {
public:queue<int> que1;queue<int> que2;    // 辅助队列,用来备份/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {que1.push(x);}/** Removes the element on top of the stack and returns that element. */int pop() {int size = que1.size();size--;while(size--) {// 将que1 导入que2,但要留下最后一个元素que2.push(que1.front());que1.pop();}int result = que1.front();  // 留下的最后一个元素就是要返回的值que1.pop();que1 = que2;                // 再将que2赋值给que1while(!que2.empty()) {      // 清空que2que2.pop();}return result;}/** Get the top element. */int top() {return que1.back();}/** Returns whether the stack is empty. */bool empty() {return que1.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();*/

2.一个队列模拟栈:一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外)重新添加到队列尾部,此时在去弹出元素就是栈的顺序了

class MyStack {
public:queue<int> que;/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {que.push(x);}/** Removes the element on top of the stack and returns that element. */int pop() {int size = que.size();size--;while(size--) {que.push(que.front());que.pop();}int result = que.front();que.pop();return result;}/** Get the top element. */int top() {return que.back();}/** Returns whether the stack is empty. */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();*/

20.有效的括号

20. 有效的括号 - 力扣(LeetCode)

  • 本题一共有三种情况

    • 字符串里左括号多余了

    • 字符串没有括号多余,但是出现不匹配的情况

    • 字符串右括号多余了

1.栈的拿手好戏:如果遇到左括号就在栈里存入对应的右括号,如果匹配的时候发现栈为空或者元素不匹配的情况就直接返回false。最后如果栈不为空的情况,也返回false

class Solution {
public:bool isValid(string s) {if(s.size() % 2 != 0) return false;stack<char> st;for(int i = 0; i < s.size(); i++) {if(s[i] == '(') st.push(')');else if(s[i] == '[') st.push(']');else if(s[i] == '{') st.push('}');else if(st.empty() || s[i] != st.top()) return false;else st.pop();}return st.empty();}
};

1047.删除字符串中的所有相邻重复项

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

1.栈的拿手好戏:遍历整个字符串,如果栈为空或者元素不匹配,就把元素存入栈中,如果元素匹配,就弹出栈的匹配元素,最后将栈输出,并反转整个结果

class Solution {
public:string removeDuplicates(string s) {stack<char> st;for(int i = 0; i < s.size(); i++) {if(st.empty() || s[i] != st.top()) {st.push(s[i]);} else {st.pop();}}string result = "";while(!st.empty()) {result += st.top();st.pop();}reverse(result.begin(), result.end());return result;}
};

150.逆波兰表达式

150. 逆波兰表达式求值 - 力扣(LeetCode)

1.栈的最后表演:和删除字符串中的所有相邻重复项类似:遇到运算符就把栈的头两个元素进行运算然后存入栈中,最后得出结果

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;for(int i = 0; i < tokens.size(); i++) {if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {int num1 = st.top();st.pop();int num2 = st.top();st.pop();if(tokens[i] == "+") st.push(num2 + num1);if(tokens[i] == "-") st.push(num2 - num1);if(tokens[i] == "*") st.push(num2 * num1);if(tokens[i] == "/") st.push(num2 / num1);} else {st.push(stoi(tokens[i]));}}int result = st.top();st.pop();return result;}
};

相关文章:

代码随想录栈和队列专题二刷复盘day17

栈和队列理论基础 队列是先进先出&#xff0c;栈是先进后出 栈和队列是STL里面的两个数据结构 三个最为普遍的STL版本 1.HP STL其他版本的C STL&#xff0c;一般是以HP STL为蓝本实现出来的&#xff0c;HP STL是C STL的第一个实现版本&#xff0c;且开放源代码 2.P.J.Plauger…...

代码随想录算法刷题训练营day16

代码随想录算法刷题训练营day16&#xff1a;LeetCode(104)二叉树的最大深度 、LeetCode(559)n叉树的最大深度、LeetCode(111)二叉树的最小深度、LeetCode(222)完全二叉树的节点个数 LeetCode(104)二叉树的最大深度 题目 代码 /*** Definition for a binary tree node.* publ…...

【C语言/数据结构】排序(直接插入排序|希尔排序)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 插入排序 直接插入排序&…...

Jupyter Notebook安装使用教程

Jupyter Notebook 是一个基于网页的交互式计算环境&#xff0c;允许你创建和共享包含代码、文本说明、图表和可视化结果的文档。它支持多种编程语言&#xff0c;包括 Python、R、Julia 等。其应用场景非常广泛&#xff0c;特别适用于数据科学、机器学习和教育领域。它可以用于数…...

Unity 中的接口和继承

在Unity的游戏开发中&#xff0c;理解面向对象编程的概念&#xff0c;如类、接口、继承和多态性&#xff0c;是非常重要的。本文旨在帮助理解和掌握Unity中接口和继承的概念&#xff0c;以及如何在实际项目中应用这些知识。 类和继承 在C#和Unity中&#xff0c;类是构建应用程序…...

C++区间覆盖(贪心算法)

假设有n个区间&#xff0c;分别是&#xff1a;[l1,r1], [l2,r2], [l3,r3].....[ln,rn] 从这n个区间中选出某些区间&#xff0c;要求这些区间满足两两不相交&#xff0c;最多能选出多少个区间呢&#xff1f; 基本思路&#xff1a; 按照右端点从小到大排序&#xff0c;再比较左端…...

Python with Office 054 - Work with Word - 7-9 插入图像 (3)

近日详细学习了寒冰老师的很好的书《让Python遇上Office》&#xff0c;总结了系列视频。 这个是其中的一集&#xff1a;如何在Word中插入图像&#xff0c;我会陆续分享其他的视频并加上相应说明 https://www.ixigua.com/7319498175104942643?logTage9d15418663166a05d10...

Nodejs前端学习Day4_fs文件系统模块基础应用之成绩转换

君子应有龙蛇之变&#xff0c;处于木雁之间 文章目录 前言一、fs文件系统模块1.1 判断文件是否读取成功1.2 向指定的文件中写入内容1.2.1 fs.writeFile的语法格式1.2.2 fs.readFile和fs.writeFile的运用——成绩转换 总结 前言 Day3fs开了点头 一、fs文件系统模块 1.1 判断文…...

五、Kotlin 函数进阶

1. 高阶函数 1.1 什么是高阶函数 以下 2 点至少满足其一的函数称为高阶函数&#xff1a; 形参列表中包含函数类型的参数 //参数 paramN 可以是&#xff1a;函数引用、函数类型变量、或 Lambda 表达式。 fun funName(param1: Type1, param2: Type2, ... , paramN: (p1: T1, p2…...

重温《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 –– 学习笔记(一)

第一部分&#xff1a;走近Java 第1章&#xff1a;走近Java 1.1 Java的技术体系 SUN 官方所定义的 Java 技术体系包括&#xff1a;Java程序设计语言、Java虚拟机、Class文件格式、Java API类库、第三方&#xff08;商业机构和开源社区&#xff09;Java类库。 其中&#xff0…...

定向减免!函数计算让轻量 ETL 数据加工更简单,更省钱

作者&#xff1a;澈尔、墨飏 业内较为常见的高频短时 ETL 数据加工场景&#xff0c;即频率高时延短&#xff0c;一般均可归类为调用密集型场景。此场景有着高并发、海量调用的特性&#xff0c;往往会产生高额的计算费用&#xff0c;而业内推荐方案一般为攒批处理&#xff0c;业…...

git checkout和git switch的区别

git checkout 和 git switch 是 Git 中用于切换分支的命令&#xff0c;但它们在某些方面有一些区别。需要注意的是&#xff0c;git switch 是在 Git 2.23 版本引入的&#xff0c;它提供了一种更直观的分支切换方式。 git checkout&#xff1a; 分支切换&#xff1a; 在 Git 2.…...

故障树分析蒙特卡洛仿真程序(附MATLAB完整代码)

故障树是一种特殊的倒立树状逻辑因果关系图&#xff0c;它用事件符号、逻辑门符号和转移符号描述系统中各种事件之间的因果关系&#xff0c;通过对引起系统故障的各种因素进行逻辑因果分析&#xff0c;确定导致故障发生的各种可能的原因&#xff0c;并通过定性和定量分析找出系…...

数据结构-线性表

文章目录 数据结构—线性表1.线性表的定义和基本操作线性表的定义线性表的特点线性表的基本操作 2.线性表的顺序存储和链式存储表示顺序存储链式存储单链表循环链表双向链表 数据结构—线性表 1.线性表的定义和基本操作 线性表的定义 定义&#xff1a;线性表是具有相同数据类…...

java金额数字转中文

java金额数字转中文 运行结果&#xff1a; 会进行金额的四舍五入。 工具类源代码&#xff1a; /*** 金额数字转为中文*/ public class NumberToCN {/*** 汉语中数字大写*/private static final String[] CN_UPPER_NUMBER {"零", "壹", "贰",…...

Ubuntu findfont: Font family ‘SimHei‘ not found.

matplotlib中文乱码显示 当我们遇到这样奇怪的问题时, 结果往往很搞笑 尝试1不行 Stopping Jupyter Installing font-manager: sudo apt install font-manager Cleaning the matplotlib cache directory: rm ~/.cache/matplotlib -fr Restarting Jupyter. 尝试2 This work fo…...

mysql小知识

什么是sql语句的子查询 SQL语句的子查询是指在一个SQL语句中嵌套另一个SQL语句。子查询可以嵌套在主查询的FROM子句、WHERE子句、HAVING子句、SELECT子句或INSERT语句中。 子查询可以返回一个结果集&#xff0c;这个结果集可以被主查询使用。子查询通常用于获取需要在主查询中使…...

Unity中URP下逐顶点光照

文章目录 前言一、之前额外灯逐像素光照的数据准备好后&#xff0c;还有最后的处理二、额外灯的逐顶点光照1、逐顶点额外灯的光照颜色2、inputData.vertexLighting3、surfaceData.albedo 前言 在上篇文章中&#xff0c;我们分析了Unity中URP下额外灯&#xff0c;逐像素光照中聚…...

Spring Boot3整合Druid(监控功能)

目录 1.前置条件 2.导依赖 错误依赖&#xff1a; 正确依赖&#xff1a; 3.配置 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动。 作者版本为3.2.2 初始化教程&#xff1a; 新版idea创建spring boot项目-CSDN博客https://blog.csdn…...

使用Gin框架,快速开发高效的Go Web应用程序

推荐 海鲸AI-GPT4.0国内站点&#xff1a;https://www.atalk-ai.com 前言 在当今的软件开发领域&#xff0c;Go语言以其简洁的语法和出色的性能逐渐成为开发者们的新宠。而Gin框架&#xff0c;则是Go语言中最受欢迎的Web框架之一&#xff0c;它以高性能和易用性著称。本文将带你…...

【Unity】【游戏开发】Pico打包后项目出现运行时错误如何Debug

【背景】 开发过程中的报错可以通过控制台查看&#xff0c;但是PICO项目这类依赖特定设备环境的应用往往存在打包后在设备端发生运行时错误。这时如何能查看到Debug信息呢&#xff1f; 【分析】 Pico也是安卓系统&#xff0c;所以这个问题就可以泛化为Unity有哪些在安卓端运…...

一种解决常用存储设备无法被电脑识别的方法

一、通用串行总线控制器描述 通用串行总线&#xff08;Universal Serial Bus&#xff0c;简称USB&#xff09;&#xff0c;是连接电脑与设备的一种序列总线标准&#xff0c;也是一种输入输出&#xff08;I/O&#xff09;连接端口的技术规范&#xff0c;广泛应用于个人电脑和移动…...

Spark运行架构以及容错机制

Spark运行架构以及容错机制 1. Spark的角色区分1.1 Driver1.2 Excuter 2. Spark-Cluster模式的任务提交流程2.1 Spark On Yarn的任务提交流程2.1.1 yarn相关概念2.1.2 任务提交流程 2.2 Spark On K8S的任务提交流程2.2.1 k8s相关概念2.2.2 任务提交流程 3. Spark-Cluster模式的…...

短剧APP小程序源码 全开源短视频系统源码/h5/app/小视频系统

主要功能介绍&#xff1a; 小剧场短剧影视小程序源码 全开源 带支付收益等模式 付费短剧小程序源码 多平台小程序支持 项目功能介绍 支持无限滑动 高性能滑动 预加载 视频预览 支持剧情介绍,集合壁纸另外仿抖音滑动效果 支持会员模式,支持用户单独购买等等多功能 本系统&…...

深度学习中图像分类、目标检测、语义分割、实例分割哪个难度大,哪个检测精度容易实现,哪个速度低。请按照难度、精度容易实现程度、速度排名。

问题描述&#xff1a;深度学习中图像分类、目标检测、语义分割、实例分割哪个难度大&#xff0c;哪个检测精度容易实现&#xff0c;哪个速度低。请按照难度、精度容易实现程度、速度排名。 问题解答&#xff1a; 以下是一般情况下深度学习中图像分类、目标检测、语义分割、实…...

【AI视野·今日NLP 自然语言处理论文速览 第七十五期】Thu, 11 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 11 Jan 2024 Totally 36 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Leveraging Print Debugging to Improve Code Generation in Large Language Models Authors Xueyu Hu, Kun K…...

数据结构:搜索二叉树 | 红黑树 | 验证是否为红黑树

文章目录 1.红黑树的概述2.红黑树的性质3.红黑树的代码实现3.1.红黑树的节点定义3.2.红黑树的插入操作3.3.红黑树是否平衡 黑红树是一颗特殊的搜索二叉树&#xff0c;本文在前文的基础上&#xff0c;图解红黑树插入&#xff1a;前文 链接&#xff0c;完整对部分关键代码展示&a…...

数据结构顺序表

思维导图 练习 头文件 1 #ifndef __HEAD_H__2 #define __HEAD_H__3 4 5 #include <stdio.h>6 #include <string.h>7 #include <stdlib.h>8 9 10 #define MAXSIZE 711 typedef int datatype;12 enum13 {14 FLASE-1,15 SUCCESS16 };17 //定义顺序表&a…...

手把手教你优雅的安装虚拟机 Ubuntu —— 图文并茂

目录 Ubuntu 获取Vmware 安装新建虚拟机Ubuntu 安装虚拟机工具安装更多内容 本文教你如何优雅的在虚拟机中安装 Ubuntu&#xff0c;图文并茂、包教包会&#xff01; Ubuntu 获取 Ubuntu 官网镜像下载速度较慢&#xff0c;建议从国内镜像网站下载&#xff0c;如网易、中科大、…...

源 “MySQL 5.7 Community Server“ 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

源 “MySQL 5.7 Community Server” 的 GPG 密钥已安装&#xff0c;但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。 失败的软件包是&#xff1a;mysql-community-server-5.7.44-1.el7.x86_64 GPG 密钥配置为&#xff1a;file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql…...