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

【C++11数据结构与算法】C++ 栈

C++ 栈(stack)

文章目录

  • C++ 栈(stack)
    • 栈的基本介绍
    • 栈的算法运用
      • 单调栈
        • 实战题
          • LC例题:[321. 拼接最大数](https://leetcode.cn/problems/create-maximum-number/)
          • LC例题:[316. 去除重复字母](https://leetcode.cn/problems/remove-duplicate-letters/)

栈的基本介绍

CPP API: stack

  • 一种先进后出(FILO)的数据结构

  • 定义:stack <typedef> stack_name ;

  • 我们在初始化一个stack时,其中的类型也可以为标准库类型以及自定义类型,如果想创建一个包含多元素的类型应该如下定义:

    // 括号中所用的就是
    stack<pair<TreeNode*, int>> treeStack;
    
函数描述
(constructor)该函数用于构造堆栈容器。
empty该函数用于测试堆栈是否为空。如果堆栈为空,则该函数返回true,否则返回false。
size该函数返回堆栈容器的大小,该大小是堆栈中存储的元素数量的度量。
top该函数用于访问堆栈的顶部元素。该元素起着非常重要的作用,因为所有插入和删除操作都是在顶部元素上执行的。
push该函数用于在堆栈顶部插入新元素。
pop该函数用于删除元素,堆栈中的元素从顶部删除。
emplace该函数用于在当前顶部元素上方的堆栈中插入新元素。
swap该函数用于交换引用的两个容器的内容。
relational operators非成员函数指定堆栈所需的关系运算符。
uses allocator顾名思义,非成员函数将分配器用于堆栈。
#include <iostream>
#include <stack>
using namespace std;
void newstack(stack <int> ss)
{stack <int> sg = ss;while (!sg.empty()){cout << '\t' << sg.top();sg.pop();}cout << '\n';
}
int main ()
{stack <int> newst;newst.push(55);newst.push(44);newst.push(33);newst.push(22);newst.push(11);cout << "最新的堆栈是 : ";newstack(newst);cout << "\n newst.size() : " << newst.size();cout << "\n newst.top() : " << newst.top();cout << "\n newst.pop() : ";newst.pop();newstack(newst); return 0;
}

关于push()和emplace():

  • push()函数接受一个参数,该参数是要添加到栈顶的元素的副本。

  • 当调用push()函数时,参数会被复制到栈中,即使元素是通过移动构造函数构造的也会发生复制。

  • emplace()函数接受的参数是用于构造栈顶元素的参数列表。

  • 当调用emplace()函数时,参数会被直接传递给栈顶元素的构造函数,避免了额外的复制操作。因此,emplace()通常比push()更高效。

  • 因此主要区别在于push()接受的是元素的值,而emplace()接受的是元素构造函数的参数列表。emplace()通常更灵活和高效,特别是当元素是通过移动构造函数构造时。

栈的算法运用

单调栈

栈内排序通常满足“单调递增”、“单调递减”,即栈中元素具备“单调性”

实战题
LC例题:321. 拼接最大数

在这个题目中,我们寻找数组的最大子串时,运用了单调栈的特性。但并非完全单调,以下,仅提供寻找最大子串func部分:

注意:这里的最大子串,指的是数组截选出来的子数组中元素相对位置不改变

vector<int> MaxSubNums(vector<int>& nums, int n){// 如果为空,不用遍历if (n == 0) {return {};}stack<int> resStack;int pos = 0;while (pos < nums.size()) {// 余下+当前大小 > 目标大小if ((resStack.size() + nums.size() - pos) == n) break;// 如果栈为空if (resStack.empty()) {resStack.push(nums[pos]);pos++;continue;}// 如果栈满了 且大于栈顶if (resStack.size() == n) {if (nums[pos] > resStack.top()) {resStack.pop();continue;}else {pos++;}}if (resStack.size() < n) {// 小于等于,直接pushif (nums[pos] <= resStack.top()) {resStack.push(nums[pos]);pos++;}else {resStack.pop();}}}while (resStack.size() < n && pos < nums.size()) {resStack.push(nums[pos]);pos++;}vector<int> result;while (!resStack.empty()) {result.push_back(resStack.top());resStack.pop();}std::reverse(result.begin(), result.end());return result;}
LC例题:316. 去除重复字母

题目:给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

image-20240408145007629

解法:因为要使结果为字典序最小,我们利用单调栈性质,使其从底至上为升序(非完全)

我们需要一个map(strCount)用于记录余下字符串中,某字符剩余多少

还需要一个set用于记录栈中已存在哪些元素

遍历字符串,入栈规则:

  • 首先:strCount[cur]–

1、若当前字符cur已在栈中,略过,

2、若当前字符cur未在栈中:

  1. cur > stack.top() || stack.empty() ,跳到第3步。
  2. cur < stack.top()
    1. 如果栈顶元素之后还会出现,弹出
    2. 循环上述操作,直到 栈空 或者 cur > stack.top() 或者栈顶元素在之后不再出现,结束循环
  3. 入栈,并在set中记录

遍历完字符串后,栈底到栈顶的元素拼起来就是最终答案。

class Solution
{
public:string removeDuplicateLetters(string s){// 判断该字符余下还有多少个unordered_map<char, int> strCount;// 判断栈中是否包含这个元素,如果有就不可以pushunordered_set<char> inStack;for (auto c : s){strCount[c]++;}// 单调栈,保持从栈底往上升序(非完全)stack<char> strStack;for (auto c : s){// 当前字符剩余个数减1strCount[c]--;// 栈中已有该元素,遍历下一个if (inStack.count(c) != 0)continue;// 如果当前栈不为空 且  当前元素大于栈顶元素,且栈顶元素在剩余字符中还会出现while (!strStack.empty() && c < strStack.top() && strCount[strStack.top()] > 0){inStack.erase(strStack.top());strStack.pop();}// 入栈strStack.push(c);// 记录该元素已经在栈中出现过inStack.insert(c);}string ans = "";while (!strStack.empty()){ans = strStack.top() + ans;strStack.pop();}return ans;}
};

相关文章:

【C++11数据结构与算法】C++ 栈

C 栈(stack) 文章目录 C 栈(stack)栈的基本介绍栈的算法运用单调栈实战题LC例题&#xff1a;[321. 拼接最大数](https://leetcode.cn/problems/create-maximum-number/)LC例题&#xff1a;[316. 去除重复字母](https://leetcode.cn/problems/remove-duplicate-letters/) 栈的基…...

pdf文件如何防篡改内容

PDF文件防篡改内容的方法有多种&#xff0c;以下是一些常见且有效的方法&#xff0c;它们可以帮助确保PDF文件的完整性和真实性&#xff1a; 加密PDF文档&#xff1a; 原理&#xff1a;通过设置密码来保护PDF文档&#xff0c;防止未经授权的访问和修改。注意事项&#xff1a;密…...

QT 音乐播放器【二】 歌词同步+滚动+特效

文章目录 效果图概述代码解析歌词歌词同步歌词特效 总结 效果图 概述 先整体说明一下这个效果的实现&#xff0c;你所看到的歌词都是QGraphicsObject&#xff0c;在QGraphicsView上绘制(paint)出来的。也就是说每一句歌词都是一个图元(item)。 为什么用QGraphicsView框架&…...

关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版)

主要最近做了一个要用STM32实现读取鼠标键盘一体的那种USB设备&#xff0c;STM32的界面上要和电脑一样的能通过这个USB接口实现鼠标移动&#xff0c;键盘的按键。然后我就很自然的去参考了正点原子的例程&#xff0c;可是找了一圈&#xff0c;发现正点原子好像用的库函数&#…...

Soildworks学习笔记(二)

放样凸台基体&#xff1a; 自动生成连接两个物体两个面的基体&#xff1a; 2.旋转切除&#xff1a; 3.剪切实体&#xff1a; 4.转换实体引用&#xff1a; 将实体的轮廓线转换至当前草图使其成为当前草图的图元,主要用于在同一平面或另一个坐标中制作草图实体或其尺寸的副本。 …...

Linux配置uwsgi环境

Linux配置uwsgi环境 1.进入虚拟环境 source /envs/django_-shop-system/bin/activate2.安装uwsgi pip install uwsgi3.基于uwsgi运行项目 – 基于配置文件 在项目目录下创建配置文件 #socket 0.0.0.0:8005 http 0.0.0.0:8005 # http120.55.47.111:8005 chdir/opt/www/djang…...

Nagios的安装和使用

*实验* *nagios安装和使用* Nagios 是一个监视系统运行状态和网络信息的监视系统。Nagios 能监视所指定的本地或远程主机以及服务&#xff0c;同时提供异常通知功能等. Nagios 可运行在 Linux/Unix 平台之上&#xff0c;同时提供一个可选的基于浏览器的 WEB 界面以方便系统管…...

Numba 的 CUDA 示例(4/4):原子和互斥

本教程为 Numba CUDA 示例 第 4 部分。 本系列第 4 部分总结了使用 Python 从头开始学习 CUDA 编程的旅程 介绍 在本系列的前三部分&#xff08;第 1 部分&#xff0c;第 2 部分&#xff0c;第 3 部分&#xff09;中&#xff0c;我们介绍了 CUDA 开发的大部分基础知识&#xf…...

【机器学习】机器学习引领AI:重塑人类社会的新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀机器学习引领AI &#x1f4d2;1. 引言&#x1f4d5;2. 人工智能&#xff08;AI&#xff09;&#x1f308;人工智能的发展&#x1f31e;应用领…...

【制作面包game】

编写一个制作面包的游戏代码涉及到游戏设计、编程和用户界面设计等多个方面。这里我可以提供一个简化版本的Python代码示例&#xff0c;用于创建一个基本的面包制作游戏。这个游戏将会有一个简单的用户界面&#xff0c;玩家可以通过输入命令来制作面包。 游戏的基本流程如下&a…...

Django更改超级用户密码

Django更改超级用户密码 1、打开shell 在工程文件目录下敲入&#xff1a; python manage.py shell再在python交互界面输入&#xff1a; from django.contrib.auth.models import User user User.objects.get(username root) user.set_password(123456) user.save()其中ro…...

ROS基础学习-ROS通信机制进阶

ROS通信机制进阶 目录 0.简介1.常用API1.1 节点初始化函数1.1.1 C++1.1.2 Python1.2 话题与服务相关函数1.2.1 对象获取相关1.2.1.1 C++1.2.1.2 Python1.2.2 订阅对象相关1.2.2.1 C++1.2.2.2 Python1.2.3 服务对象相关函数1.2.3.1 C++1.2.3.2 Python1.2.4 客户端对象相关1.2.4.…...

【Vue3】shallowReactive() and shallowReadonly()

历史小剧场 所谓历史&#xff0c;就是过去的事&#xff0c;它的残酷之处在于&#xff1a;无论你哀嚎&#xff0c;悲伤&#xff0c;痛苦&#xff0c;落寞&#xff0c;追悔&#xff0c;它都无法改变。 一具有名的尸体躺在无数无名的尸体上&#xff0c;这就是所谓的霸业。---- 《明…...

【javaEE初阶】

&#x1f308;&#x1f308;&#x1f308;关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE&#xff0c;一般称为java企业版&#xff0c;实际上java的历史可以追溯到上个世纪90年代&#xff0c;当时主要的语言主流的还是C语言和C&#xff0c;但是在那个时期嵌入式初…...

深度学习 - 梯度下降优化方法

梯度下降的基本概念 梯度下降&#xff08;Gradient Descent&#xff09;是一种用于优化机器学习模型参数的算法&#xff0c;其目的是最小化损失函数&#xff0c;从而提高模型的预测精度。梯度下降的核心思想是通过迭代地调整参数&#xff0c;沿着损失函数下降的方向前进&#…...

Steam下载游戏很慢?一个设置解决!

博主今天重装系统后&#xff0c;用steam下载发现巨慢 500MB&#xff0c;都要下载半小时。 平时下载软件&#xff0c;一般1分钟就搞定了&#xff0c;于是大致就知道&#xff0c;设置应该出问题了 于是修改了&#xff0c;如下设置之后&#xff0c;速度翻了10倍。 如下&#x…...

51单片机采用定时器T1的方式1的中断计数方式,外接开关K4按4次后,8只LED闪烁不停

1、功能描述 采用定时器T1的方式1的中断计数方式&#xff0c;外接开关K4按4次后&#xff0c;8只LED闪烁不停 2、实验原理 定时器原理:8051的定时器可以用于计数外部事件或执行内部定时操作。在本程序中&#xff0c;定时器1被设置为模式2&#xff0c;即8位自动重装载定时器模式…...

windows系统 flutter 开发环境配置

1、管理员运行powershell&#xff0c;安装&#xff1a;Chocolatey 工具&#xff0c;粘贴复制运行下列脚本: Chocolatey 官方安装文档 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManage…...

【线性代数】SVDPCA

用最直观的方式告诉你&#xff1a;什么是主成分分析PCA_哔哩哔哩_bilibili 奇异值分解singular value decomposition&#xff0c;SVD principal component analysis,PCA 降维操作 pca就是降维后使得信息损失最小 投影在坐标轴上的点越分散&#xff0c;信息保留越多 pca的实现…...

1.Vue2使用ElementUI-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址&#xff1a;source-code: 源码笔记 1.下载nodejs v16.x 下载地址&#xff1a;Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…...

OS复习笔记ch7-3

承接上文我们讲完了页式管理和段式管理&#xff0c;接下来让我们深入讲解一下快表和二级页表 快表 快表和计算机组成原理讲的Cache原理如出一辙。为了减少访存的次数&#xff0c;OS在访问页面的时候创建了快表&#xff08;Translation Lookaside Buffer &#xff0c;简称TLB&…...

MFC 教程-回车时窗口退出问题

【问题描述】 MFC窗口默认时&#xff0c;按回车窗口会退出 【原因分析】 默认调用OnOK() 【解决办法】 重写虚函PreTranslateMessage BOOL CTESTMFCDlg::PreTranslateMessage(MSG* pMsg) {// TODO: 在此添加专用代码和/或调用基类// 修改回车键的操作反应 if (pMsg->…...

CTFHUB-SQL注入-字符型注入

目录 查询数据库名 查询数据库中的表名 查询表中数据 总结 此题目和上一题相似&#xff0c;一个是整数型注入&#xff0c;一个是字符型注入。字符型注入就是注入字符串参数&#xff0c;判断回显是否存在注入漏洞。因为上一题使用手工注入查看题目 flag &#xff0c;这里就不…...

Docker配置Redis集群以及主从扩容与缩容

基础镜像拉取 docker run -p 6379:6379 -d redis:6.0.8 配置文件以及数据卷挂载 # 开启密码验证&#xff08;可选&#xff09; requirepass 1234 # 允许redis外地连接&#xff0c;需要注释掉绑定的IP # bind 127.0.0.1 # 关闭保护模式&#xff08;可选&#xff09; protected-m…...

【计算机网络】 传输层

一、传输层提供的服务 1.1 传输层的功能 1.1.1 传输层的功能如下&#xff1a; 传输层提供应用进程之间的逻辑通信&#xff08;即端到端的通信&#xff09;。与网络层的区别是&#xff1a;网络层提供的是主机之间的逻辑通信。 1.1.2 复用和分用 传输层要还要对收到的报文进行…...

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十七)- 微服务(7)

11.1 : 同步调用的问题 11.2 异步通讯的优缺点 11.3 MQ MQ就是事件驱动架构中的Broker 安装MQ docker run \-e RABBITMQ_DEFAULT_USERxxxx \-e RABBITMQ_DEFAULT_PASSxxxxx \--name mq \--hostname mq1 \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq:3-management 浏览器访问1…...

Java Web应用,IPv6问题解决

在Java Web程序中&#xff0c;如果使用Tomcat并遇到了IPv6相关的问题&#xff0c;可以通过以下几种方式来解决&#xff1a; 1. 配置Tomcat以使用IPv4 默认情况下&#xff0c;Java可能会优先使用IPv6。如果你希望Tomcat使用IPv4&#xff0c;最简单的方法是通过设置系统属性来强…...

MyBatis二级缓存开启条件

MyBatis缓存为俩层体系。分为一级缓存和二级缓存。 一级缓存&#xff1a; 一级缓存默认开启&#xff0c;一级缓存的作用域是SqlSession级别的&#xff0c;这意味着当你更换SqlSession之后就不能再利用原来的SqlSession的一级缓存了。不同的SqlSession之间的一级缓存是隔离的。…...

golang 不用sleep如何实现实现每隔指定时间执行一次for循环?

今天介绍的是在go语言里面不用time.Sleep&#xff0c; 使用for range 定时器管道 来实现按照我们指定的时间间隔来执行for循环, 即&#xff1a; for range ticker.C { } 这样就实现了for每隔指定时间执行一次&#xff0c;除非管道被关闭&#xff0c;否则for而且会一直柱塞当前线…...

【el-tooltips改造】Vue实现文本溢出才显示el-tooltip,否则不显示el-tooltips

实现原理&#xff1a; 使用disabled属性控制el-tooltip的content显示与隐藏&#xff1b; 目标&#xff1a; 1行省略、多行省略、可缩放页面内的文本省略都有效。 实现方式&#xff1a; 1、自定义全局指令&#xff0c;tooltipAutoShow.js代码如下&#xff08;参考的el-table中的…...

华艺网站建设/百度云网盘入口

Python是目前最火的编程语言之一&#xff0c;python简单易学、好上手&#xff0c;是很多人的首选编程语言。对于想做程序员的人来说&#xff0c;学python能够更快地接触到计算机工作。对于其他行业的人而言&#xff0c;学好了python也能大大提高工作效率。Python学了有什么好处…...

python做网站原理/网站有吗免费的

前言 在JVM专栏的第一篇&#xff1a;我们讲了什么是双亲委派模型&#xff0c;以及为什么需要双亲委派模型。还没看过的大佬&#xff0c;有钱没钱都捧个人场&#xff0c;点它&#xff1a; 你能说出jvm的类加载是什么吗 同时还了解到这样设计是为了保持JVM整个体系的稳定。但在…...

建站哪家公司比较好而且不贵/做一个企业网站大概需要多少钱

任务调度的crond常驻命令 crond 是linux用来定期执行程序的命令。当安装完成操作系统之后&#xff0c;默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作&#xff0c;如果有要执行的工作便会自动执行该工作。 1、linux任务调度的工作主要分为以下两类&…...

西安当地做网站的公司/网络营销的概念及特征

毕业大半年了&#xff0c;现在还清晰的记得当时毕业论文不会用SPSS的痛苦&#xff0c;每天挣扎把度娘、知乎、知网、优酷、某宝等各大网站都逛了个遍&#xff0c;依然没有找到用SPSS完整的分析一份问卷的流程&#xff0c;几乎都是零零散散的一些知识&#xff0c;又或是几十个视…...

用html5做课程教学网站/网站排名前十

题目背景 原 维护队列 参见P1903 题目描述 某一天\(WJMZBMR\)在打\(osu~~~\)但是他太弱逼了&#xff0c;有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有\(n\)次点击要做&#xff0c;成功了就是\(o\)&#xff0c;失败了就是\(x\)&#xff0c;分数是按\(combo\)计算的&am…...

做美工的网站/上海专业的seo公司

xampp的安装和thinkphp的部署一、xampp的安装1、xampp的下载&#xff1a;https://www.apachefriends.org/zh_cn/index.htmlxampp for linux v5.6.12下载的文件为&#xff1a;xampp-linux-x64-5.6.12-0-installer.run2、安装其他权限无法安装。切换到linux的root权限下&#xff…...