C++ STL之栈stack

一.概述

C++ 中的 std::stack 是一种容器适配器,提供了一种后进先出(LIFO, Last In First Out)的数据结构。它只允许在栈顶进行插入和删除操作,不支持随机访问
主要特性:

  • 后进先出(LIFO):最后插入的元素最先被访问或移除。
  • 栈顶操作:只能在栈顶插入、访问和移除元素。
  • 受限接口:std::stack 只提供插入、删除、访问栈顶、检查大小和判断是否为空等基本操作,不支持像 std::vector 这样的随机访问。

二.初始化

2.1头文件

#include <stack>

2.2初始化

stack支持多种初始化方式,默认使用deque作为底层容器。

stack<int> s1; //默认构造
stack<int> s2(s1);  //拷贝构造,使用s1初始化s2
stack<int> s3(move(s1));  // 使用移动语义初始化s3
stack<int, vector<int>> s4; //使用vector作为底层容器
stack<int, list<int>> s5; //使用list作为底层容器vector<int> vec = {1, 2, 3, 4, 5};
stack<int, vector<int>> s6(vec); //使用已有的vector初始化deque<int> deq = {6, 7, 8, 9, 10};
stack<int, deque<int>> s7(deq); //使用已有的deque初始化

三.成员函数

接口含义
top()访问栈顶元素。
size()返回栈中元素的个数。
empty()判断栈是否为空。如果栈为空,返回 true,否则返回 false。
pop()移除栈顶元素。
push()将元素压入栈顶。
swap(stack& other)交换两个栈的内容,两个栈必须具有相同的类型和底层容器。

四.遍历

4.1 破坏性的

通过 pop() 操作来访问每个栈顶元素并将其移除。

#include <iostream>
#include <stack>using namespace std;int main() {stack<int> s;s.push(10);s.push(20);s.push(30);while (!s.empty()) {cout << s.top() << " ";  // 访问栈顶元素s.pop();  // 移除栈顶元素}return 0;
}/*
output:30 20 10 
*/

4.2 非破坏性的

为了不破坏原始栈,可以使用一个辅助栈来保存遍历时的内容。遍历时将元素从原栈弹出到辅助栈,遍历完成后再将元素从辅助栈弹回原栈。

#include <iostream>
#include <stack>using namespace std;int main() {stack<int> s;s.push(10);s.push(20);s.push(30);stack<int> temp;  // 辅助栈while (!s.empty()) {cout << s.top() << " ";  // 访问栈顶元素temp.push(s.top());  // 存入辅助栈s.pop();  // 从原栈中移除}cout << endl;// 将元素从辅助栈移回原栈,恢复原始状态while (!temp.empty()) {s.push(temp.top());temp.pop();}return 0;
}/*
output:30 20 10 
*/

4.3 使用底层容器遍历(不推荐)

stack能够基于deque、vector 或list构建。可以通过访问栈的底层容器来实现遍历,前提是需要了解依赖的具体底层容器类型。
注:可能会因为编译器问题导致出错(不能直接访问它的底层容器(如 c),因为受到了protected访问控制限制),那就参考4.4或者4.5的方法

#include <iostream>
#include <stack>
#include <deque>using namespace std;int main() {stack<int, deque<int>> s;  // 使用deque作为底层容器s.push(10);s.push(20);s.push(30);// 通过底层容器的迭代器进行遍历for (auto it = s.c.begin(); it != s.c.end(); ++it) {cout << *it << " ";}return 0;
/*
output:10 20 30 
*/
}

4.4 使用deque来模拟栈,并遍历:

#include <iostream>
#include <deque>using namespace std;int main() {// 使用 std::deque 模拟栈deque<int> deq;// 向 "栈" 中推入元素deq.push_back(10);deq.push_back(20);deq.push_back(30);// 遍历 deque (从栈底到栈顶)for (auto it = deq.begin(); it != deq.end(); ++it) {cout << *it << " ";}cout << endl;// 模拟栈顶操作(访问最后一个元素)cout << "栈顶元素是: " << deq.back() << endl;// 模拟弹出栈顶元素deq.pop_back();  // 移除栈顶元素cout << "弹出栈顶元素后,新的栈顶是: " << deq.back() << endl;return 0;
}
/*
output:
10 20 30 
栈顶元素是: 30
弹出栈顶元素后,新的栈顶是: 20
*/

4.5 自定义栈类

标准库不允许直接访问stack的底层容器,但可以通过继承stack来扩展它并提供对底层容器的访问接口。

#include <iostream>
#include <stack>
#include <deque>using namespace std;// 自定义继承 std::stack 的类
template<typename T>
class MyStack : public stack<T> {
public:// 提供底层容器的访问接口typename deque<T>::iterator begin() {return this->c.begin();}typename deque<T>::iterator end() {return this->c.end();}
};int main() {// 使用自定义栈MyStack<int> s;s.push(10);s.push(20);s.push(30);// 遍历底层容器cout << "栈中的元素(从底到顶):" << endl;for (auto it = s.begin(); it != s.end(); ++it) {cout << *it << " ";}return 0;
}
/*
output:10 20 30 
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树(Java)

一.1.树形结构概念的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a;…

大模型培训讲师叶梓:Llama Factory 微调模型实战分享提纲

LLaMA-Factory ——一个高效、易用的大模型训练与微调平台。它支持多种预训练模型&#xff0c;并且提供了丰富的训练算法&#xff0c;包括增量预训练、多模态指令监督微调、奖励模型训练等。 LLaMA-Factory的优势在于其简单易用的界面和强大的功能。用户可以在不编写任何代码的…

【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、BitField

前言&#xff1a; 上篇博客我们讲到redis五大基本数据类型&#xff08;也是就下图的第一列&#xff09;。 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客文章浏览阅读1k次&#xff0c;点赞24次&#xff0c;收藏10次。该篇适用于速成redis。本篇我们将讲解&#…

Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

问题&#xff1a;Leetcode 2246. 相邻字符不同的最长路径 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&#xff0c;根节点是节点 0 &#xff0c;这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树&#x…

001.从0开始实现线性回归(pytorch)

000动手从0实现线性回归 0. 背景介绍 我们构造一个简单的人工训练数据集&#xff0c;它可以使我们能够直观比较学到的参数和真实的模型参数的区别。 设训练数据集样本数为1000&#xff0c;输入个数&#xff08;特征数&#xff09;为2。给定随机生成的批量样本特征 X∈R10002 …

【Delphi】扩展现有组件创建新的 FireMonkey 组件(步骤二)

实现指定格式的属性 步骤 1 中创建的 TClockLabel 组件需要在显示当前时间时定义日期时间格式作为属性&#xff0c;以便组件用户可以指定。 一、实现指定格式的属性 要实现格式属性&#xff0c;请在 TClockLabel class 的发布部分添加以下一行&#xff1a; property Form…

CST电磁仿真77GHz汽车雷达保险杠

77G毫米波雷达仿真时&#xff0c;要考虑天线罩和保险杠的影响。通常保险杠都是多层结构&#xff0c;有的层非常薄。如果采用传统的3D建模方法&#xff0c;会导致网格数量巨大&#xff0c;进而影响到求解效率。 三维保险杠&#xff08;bumper&#xff09;模型如下图所示&…

【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析

文章目录 C string 类详解&#xff1a;从入门到精通前言第一章&#xff1a;C 语言中的字符串 vs C string 类1.1 C 语言中的字符串1.2 C string 类的优势 第二章&#xff1a;string 类的构造与基础操作2.1 string 类的构造方法2.1.1 示例代码&#xff1a;构造字符串 2.2 string…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源&#xff0c;cuda > 12.0使用云服务器&#xff0c;部署fastGPT oneAPI&#xff0c;M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…

flutter遇到问题及解决方案

目录 1、easy_refresh相关问题 2、 父子作用域关联问题 3. 刘海屏底部安全距离 4. 了解保证金弹窗 iOS端闪退 &#xff08;待优化&#xff09; 5. loading无法消失 6. dialog蒙版问题 7. 倒计时优化 8. scrollController.offset报错 9. 断点不走 10.我的出价报红 11…

Python3爬虫教程-HTTP基本原理

HTTP基本原理 1&#xff0c;URL组成部分详解2&#xff0c;HTTP和HTTPS3&#xff0c;HTTP请求过程4&#xff0c;请求&#xff08;Request&#xff09;请求方法&#xff08;Request Method&#xff09;请求的网址&#xff08;Request URL&#xff09;请求头&#xff08;Request H…

Redmi Note 7 Pro(violet)免授权9008文件分享及刷机教程

获取文件 关注微信公众号 heStudio Community回复 violet_9008 获取下载链接。 刷机教程 下载搞机助手&#xff08;可以从上方文件中获取&#xff09;并安装。手机按音量减键和电源键进入 Fastboot 模式&#xff0c; 打开搞机助手&#xff0c;点击进入 9008 模式 等待手机…

IDEA 关闭自动补全功能(最新版本)

文章目录 一、前言二、关闭自动补全三、最终效果 一、前言 在最新的 IDEA 中发布了自动补全功能&#xff0c;当你输入代码时&#xff0c;IDEA 会自动显示你可能想输入的代码&#xff0c;减少手动输入的工作量&#xff0c;它会根据上下文提供正确的选项&#xff0c;提高代码的准…

Java-数据结构-二叉树-习题(三)  ̄へ ̄

文本目录&#xff1a; ❄️一、习题一(前序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️二、习题二(中序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️三、习题三(后序遍历非递归)&#xff1a; ▶ 思路&#xff1a; …

vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源

之前项目使用的pdf.js 是2.15.349版本&#xff0c;最近换了一个4.6.82的版本&#xff0c;在本地上浏览文件运行的好好的&#xff0c;但是发布到服务器&#xff08;IIS&#xff09;上打不开文件&#xff0c;控制台提示找不到pdf.mjs viewer.mjs。 之前使用的2.15.349pdf和viewer…

Git使用手册

1、初识Git 概述&#xff1a;Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理项目版本管理。 知识点补充&#xff1a; 版本控制&#xff1a;一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 分布式&#xff1a;每个人…

M9410A VXT PXI 矢量收发信机,300/600/1200MHz带宽

M9410A PXI 矢量收发信机 -300/600/1200MHz带宽- M9410A VXT PXI 矢量收发信机&#xff0c;300/600/1200MHz带宽支持 5G 的 PXI 矢量收发信机&#xff08;VXT&#xff09;是一个 2 插槽模块&#xff0c;具有 1.2 GHz 的瞬时带宽 主要特点 Keysight M9410A VXT PXIe 矢量收发…

Leetcode 1039. 多边形三角形剖分的最低得分 枚举型区间dp C++实现

问题&#xff1a;Leetcode 1039. 多边形三角形剖分的最低得分 你有一个凸的 n 边形&#xff0c;其每个顶点都有一个整数值。给定一个整数数组 values &#xff0c;其中 values[i] 是第 i 个顶点的值&#xff08;即 顺时针顺序 &#xff09;。 假设将多边形 剖分 为 n - 2 个三…

【QML】Button图标设置透明颜色,会变模糊有阴影

原图效果 1. 透明 1.1 效果 1.2 代码 Button{id: _mBtnwidth: parent.widthheight: parent.heightbackground: Rectangle{id: _mBgradius: 5antialiasing: truecolor: "white"}icon{source: _mRoot._mIconSourcecache: falsecolor: "transparent" //透明…