【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 ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

解法:因为要使结果为字典序最小,我们利用单调栈性质,使其从底至上为升序(非完全)
我们需要一个map(strCount)用于记录余下字符串中,某字符剩余多少
还需要一个set用于记录栈中已存在哪些元素
遍历字符串,入栈规则:
- 首先:strCount[cur]–
1、若当前字符cur已在栈中,略过,
2、若当前字符cur未在栈中:
- cur > stack.top() || stack.empty() ,跳到第3步。
- cur < stack.top()
- 如果栈顶元素之后还会出现,弹出
- 循环上述操作,直到
栈空或者cur > stack.top()或者栈顶元素在之后不再出现,结束循环
- 入栈,并在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例题:[321. 拼接最大数](https://leetcode.cn/problems/create-maximum-number/)LC例题:[316. 去除重复字母](https://leetcode.cn/problems/remove-duplicate-letters/) 栈的基…...
pdf文件如何防篡改内容
PDF文件防篡改内容的方法有多种,以下是一些常见且有效的方法,它们可以帮助确保PDF文件的完整性和真实性: 加密PDF文档: 原理:通过设置密码来保护PDF文档,防止未经授权的访问和修改。注意事项:密…...
QT 音乐播放器【二】 歌词同步+滚动+特效
文章目录 效果图概述代码解析歌词歌词同步歌词特效 总结 效果图 概述 先整体说明一下这个效果的实现,你所看到的歌词都是QGraphicsObject,在QGraphicsView上绘制(paint)出来的。也就是说每一句歌词都是一个图元(item)。 为什么用QGraphicsView框架&…...
关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版)
主要最近做了一个要用STM32实现读取鼠标键盘一体的那种USB设备,STM32的界面上要和电脑一样的能通过这个USB接口实现鼠标移动,键盘的按键。然后我就很自然的去参考了正点原子的例程,可是找了一圈,发现正点原子好像用的库函数&#…...
Soildworks学习笔记(二)
放样凸台基体: 自动生成连接两个物体两个面的基体: 2.旋转切除: 3.剪切实体: 4.转换实体引用: 将实体的轮廓线转换至当前草图使其成为当前草图的图元,主要用于在同一平面或另一个坐标中制作草图实体或其尺寸的副本。 …...
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 能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等. Nagios 可运行在 Linux/Unix 平台之上,同时提供一个可选的基于浏览器的 WEB 界面以方便系统管…...
Numba 的 CUDA 示例(4/4):原子和互斥
本教程为 Numba CUDA 示例 第 4 部分。 本系列第 4 部分总结了使用 Python 从头开始学习 CUDA 编程的旅程 介绍 在本系列的前三部分(第 1 部分,第 2 部分,第 3 部分)中,我们介绍了 CUDA 开发的大部分基础知识…...
【机器学习】机器学习引领AI:重塑人类社会的新纪元
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀机器学习引领AI 📒1. 引言📕2. 人工智能(AI)🌈人工智能的发展🌞应用领…...
【制作面包game】
编写一个制作面包的游戏代码涉及到游戏设计、编程和用户界面设计等多个方面。这里我可以提供一个简化版本的Python代码示例,用于创建一个基本的面包制作游戏。这个游戏将会有一个简单的用户界面,玩家可以通过输入命令来制作面包。 游戏的基本流程如下&a…...
Django更改超级用户密码
Django更改超级用户密码 1、打开shell 在工程文件目录下敲入: python manage.py shell再在python交互界面输入: 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()
历史小剧场 所谓历史,就是过去的事,它的残酷之处在于:无论你哀嚎,悲伤,痛苦,落寞,追悔,它都无法改变。 一具有名的尸体躺在无数无名的尸体上,这就是所谓的霸业。---- 《明…...
【javaEE初阶】
🌈🌈🌈关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE,一般称为java企业版,实际上java的历史可以追溯到上个世纪90年代,当时主要的语言主流的还是C语言和C,但是在那个时期嵌入式初…...
深度学习 - 梯度下降优化方法
梯度下降的基本概念 梯度下降(Gradient Descent)是一种用于优化机器学习模型参数的算法,其目的是最小化损失函数,从而提高模型的预测精度。梯度下降的核心思想是通过迭代地调整参数,沿着损失函数下降的方向前进&#…...
Steam下载游戏很慢?一个设置解决!
博主今天重装系统后,用steam下载发现巨慢 500MB,都要下载半小时。 平时下载软件,一般1分钟就搞定了,于是大致就知道,设置应该出问题了 于是修改了,如下设置之后,速度翻了10倍。 如下&#x…...
51单片机采用定时器T1的方式1的中断计数方式,外接开关K4按4次后,8只LED闪烁不停
1、功能描述 采用定时器T1的方式1的中断计数方式,外接开关K4按4次后,8只LED闪烁不停 2、实验原理 定时器原理:8051的定时器可以用于计数外部事件或执行内部定时操作。在本程序中,定时器1被设置为模式2,即8位自动重装载定时器模式…...
windows系统 flutter 开发环境配置
1、管理员运行powershell,安装:Chocolatey 工具,粘贴复制运行下列脚本: Chocolatey 官方安装文档 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManage…...
【线性代数】SVDPCA
用最直观的方式告诉你:什么是主成分分析PCA_哔哩哔哩_bilibili 奇异值分解singular value decomposition,SVD principal component analysis,PCA 降维操作 pca就是降维后使得信息损失最小 投影在坐标轴上的点越分散,信息保留越多 pca的实现…...
1.Vue2使用ElementUI-初识及环境搭建
目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址:source-code: 源码笔记 1.下载nodejs v16.x 下载地址:Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
