C++中的STL——stack类的基本使用

目录

stack类介绍

stack类定义

stack类常见构造函数

stack数据操作

empty()函数

size()函数

top()函数

push()函数

pop()函数

swap()函数


stack类介绍

  1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
  3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类
  4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。

stack类定义

template <class T, class Container = deque<T> > class stack;

stack类为类模板,所以在使用时需要带上类型表示一个具体的类,例如数据类型为int类型的stack使用时需要写为stack<int>

stack类常见构造函数

构造函数

函数原型

无参构造函数

explicit stack (const container_type& ctnr = container_type());

📌

上面表格中的前三个构造函数均含有自定义空间配置器并带有缺省值,目前只使用默认即可

📌

使用stack类需要包含头文件<stack>

示例代码:

#include <iostream>
#include <stack>
using namespace std;int main()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);//打印栈while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;return 0;
}
输出结果:
5 4 3 2 1

stack数据操作

函数

功能

empty()

判断调用对象栈是否为空栈

size()

获取调用对象栈中的有效数据个数

top()

获取调用对象栈中的栈顶元素

push()

向调用对象栈顶插入元素

pop()

弹出调用对象栈顶元素

swap()

交换调用对象栈和指定栈

empty()函数

使用empty()函数可以判断调用对象栈是否为空栈

函数

函数原型

empty()

bool empty() const;

示例代码:

#include <iostream>
#include <stack>
using namespace std;int main()
{stack<int> st;stack<int> st1;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);cout << "st: " << st.empty() << endl;cout << "st1: " << st1.empty() << endl;return 0;
}
输出结果:
st: 0
st1: 1

size()函数

使用size()函数可以获取调用对象栈中的有效数据个数

函数

函数原型

size()

size_type size() const;

示例代码:

#include <iostream>
#include <stack>
using namespace std;int main()
{stack<int> st;stack<int> st1;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);cout << "st: " << st.size() << endl;cout << "st1: " << st1.size() << endl;return 0;
}
输出结果:
st: 5
st1: 0

top()函数

使用top()函数可以获取调用对象栈中的栈顶元素

函数

函数原型

top()

value_type& top();

const value_type& top() const;

📌

注意,如果栈为空时取栈内元素将会出现断言错误

示例代码:

#include <iostream>
#include <stack>
using namespace std;int main()
{stack<int> st;stack<int> st1;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);cout << "st: " << st.top() << endl;// 断言错误//cout << "st1: " << st1.top() << endl;return 0;
}
输出结果:
5

push()函数

使用push()函数可以向调用对象栈内插入数据

函数

函数原型

push()

void push (const value_type& val);

示例代码:

#include <iostream>
#include <stack>
using namespace std;int main()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);//打印栈while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;return 0;
}
输出结果:
5 4 3 2 1

pop()函数

使用pop()函数可以弹出调用对象栈的栈顶元素

函数

函数原型

pop()

void pop();

📌

注意,当栈中没有元素时,调用pop()函数会出现断言错误

#include <iostream>
#include <stack>
using namespace std;int main()
{stack<int> st;stack<int> st1;st.push(1);st.push(2);st.push(3);cout << st.top() << " ";st.pop();st.push(4);st.push(5);//打印栈while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;// 断言错误//cout << "st1: " << st1.top() << endl;return 0;
}
输出结果:
3 5 4 2 1

swap()函数

使用swap()函数可以交换调用对象栈和指定对象栈

函数

函数原型

swap()

void swap (stack& x);

示例代码:

#include <iostream>
#include <stack>
using namespace std;int main()
{stack<int> st;stack<int> st1;st.push(1);st.push(1);st.push(1);st.push(1);st.push(1);st1.push(2);st1.push(2);st1.push(2);st1.push(2);st1.push(2);cout << "交换前:" << endl;//打印栈while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;//打印栈while (!st1.empty()){cout << st1.top() << " ";st1.pop();}cout << endl;// 注意打印已经使栈为空,需要重新插入元素st.push(1);st.push(1);st.push(1);st.push(1);st.push(1);st1.push(2);st1.push(2);st1.push(2);st1.push(2);st1.push(2);st.swap(st1);cout << "交换后:" << endl;//打印栈while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;//打印栈while (!st1.empty()){cout << st1.top() << " ";st1.pop();}cout << endl;return 0;
}
交换前:
1 1 1 1 1
2 2 2 2 2
交换后:
2 2 2 2 2
1 1 1 1 1

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

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

相关文章

【Leetcode】string类刷题

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;Leetcode刷题 目录 1.仅反转字母2.字符串中第一个唯一字符3.验证回文串4.字符串相加5.反转字符串I I6.反转字符串中的单词III7.字符串相乘8.把字符串转换为整数 1.仅反转字母 题目链接&#xff1a;…

Rust 模式匹配中的 和 ref

一、Rust & 和 ref 1.Rust的ref有什么用 根据Rust官方文档https://doc.rust-lang.org/std/keyword.ref.html Rust ref 主要用在模式匹配match的所有权问题中。 ref在 Rust中&#xff0c;也是声明一个指针类型变量&#xff0c;进一步说明ref和&在其它方面区别&#xf…

一篇文章带您了解面向对象(java)

1.简单理解面向过程编程和面向对象编程 面向过程编程&#xff1a;开发一个一个的方法&#xff0c;有数据需要处理&#xff0c;我们就可以调用方法来处理。 package com.web.quictstart;public class demo1 {public static void main(String[] args) {totalScore("张三&q…

mac上VMware fusion net模式无法正常使用的问题

更新时间&#xff1a;2024年04月22日21:39:04 1. 问题 环境&#xff1a; intel芯片的macbook pro VMware fusion 13.5.1 无法将“Ethernet0”连接到虚拟网络“/dev/vmnet8”。在这里显示这个之后&#xff0c;应该是vmnet8的网段发生了冲突&#xff0c;所以导致无法正常使用…

【栈】Leetcode 739. 每日温度【中等】

每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输入…

【操作系统】——死锁

基础知识 一个进程需要向一个进程传递数据&#xff0c;后面的进程必须等到前面的进程到达才能继续运行&#xff0c;这是进程间的一种次序关系。称为同步 在引入线程的系统中&#xff0c;进程内的多个线程可以并发或并行运行 遇到问题&#xff1a;对资源不加限制地分配可能导致…

字符串加密

描述 这是一个古老的字符串加密方法&#xff0c;给定两个长度不超过100个字符的字符串&#xff0c;判断是否可以把其中一个重排&#xff0c;然后对26个字母做一个一一映射&#xff0c;使得两个字符串相同。 再进行映射&#xff1a;例如 每个字母映射到前一个字母&#xff08;B…

基于Spring Cloud Alibaba的异地多活设计

胡弦&#xff0c;视频号2023年度优秀创作者&#xff0c;互联网大厂P8技术专家&#xff0c;Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者&#xff0c;资深架构师&#xff0c;技术负责人&#xff0c;极客时间训练营讲师&#xff0c;四…

论坛报名 | 中关村论坛“区块链与隐私计算论坛”报名开始!

2024中关村论坛—区块链与隐私计算论坛 正在报名&#xff01; 长安链开源社区作为区块链与隐私计算分论坛协同支持社区&#xff0c;为社区成员单位提供免费参会名额&#xff0c;名额有限先到先得&#xff0c;欢迎积极报名&#xff01; 论坛时间&#xff1a;2024年4月27日&…

前端开发攻略---拖动归类,将元素拖拽到相应位置

1、演示 2、代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-…

【ZZULIOJ】1076: 三位数求解(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 已知xyzyzzn&#xff0c;其中n是一个正整数&#xff0c;x、y、z都是数字&#xff08;0-9&#xff09;&#xff0c;编写一个程序求出x、y、z分别代表什么数字。如果无解&#xff0c;则输出“No…

2024年Q1季度平板电视行业线上市场销售数据分析

Q1季度平板电视线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;平板电视累计销量约360万件&#xff0c;环比下降12%&#xff0c;同比下降30%&#xff1b;累计销售额约99亿元&#xff0c;环比下降28%&a…

学习STM32第十七天

备份域详解 一、简介 在参考手册的电源控制章节&#xff0c;提到了备份域&#xff0c;BKPR是在RTC外设中用到&#xff0c;包含20个备份数据寄存器&#xff08;80字节&#xff09;&#xff0c;备份域包括4KB的备份SRAM&#xff0c;以32位、16位或8位模式寻址&#xff0c;在VBAT…

vue中使用input上传做了文件个数限制,触发了限制之后再次上传刚刚的图片触发不了事件

如果在Vue中使用<input type"file">上传文件&#xff0c;并设置了文件个数的限制&#xff0c;那么在达到限制后&#xff0c;再次上传相同的图片可能不会触发change事件。这是因为浏览器认为文件并没有发生变化&#xff0c;所以不会触发change事件。 解决这个问…

【JavaScript编程实操15】DOM实操_轮播图

前言 焦点轮播图是通过定时器实现的,每隔2秒切换到下一张图片,并隐藏当前图片,显示下一张图片。这种方式使用一套图片以一定时间间隔进行循环播放,可以营造出一种轮播的效果,可以通过CSS3动画、jQuery插件、JavaScript来实现。。 轮播图特点: ①自动循环播放 ②指示器聚…

C++初阶学习第二弹——C++入门(下)

C入门&#xff08;上&#xff09;&#xff1a;C初阶学习第一弹——C入门&#xff08;上&#xff09;-CSDN博客 目录 一、引用 1.1 引用的实质 1.2 引用的用法 二、函数重载 三、内敛函数 四、auto关键字 五、总结 前言&#xff1a; 在上面一章我们已经讲解了C的一些基本…

代码重构:提升软件开发效率的关键

代码重构在软件开发中扮演着至关重要的角色。它不仅可以提高代码的质量和可维护性&#xff0c;还能够增强代码的可读性&#xff0c;降低后期维护成本&#xff0c;从而提高开发效率。本文将探讨代码重构的作用以及我们常用的一些重构方法。 代码重构的作用 提高代码质量&#…

Vue2进阶之Vue2高级用法

Vue2高级用法 mixin示例一示例二 plugin插件自定义指令vue-element-admin slot插槽filter过滤器 mixin 示例一 App.vue <template><div id"app"></div> </template><script> const mixin2{created(){console.log("mixin creat…

【Java网络编程】TCP通信(Socket 与 ServerSocket)和UDP通信的三种数据传输方式

目录 1、TCP通信 1.1、Socket 和 ServerSocket 1.3、TCP通信示例 2、UDP的三种通信&#xff08;数据传输&#xff09;方式 1、TCP通信 TCP通信协议是一种可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象 通信之前要保证连接已经建立&#xff08;注意TCP是一…

【Interconnection Networks 互连网络】Torus 网络拓扑

1. Torus 网络拓扑2. Torus 网络拓扑结构References 1. Torus 网络拓扑 Torus 和 Mesh 网络拓扑&#xff0c;又可以称为 k-ary n-cubes&#xff0c;在规则的 n 维网格中包裹着 N k^n 个节点&#xff0c;每个维度都有 k 个节点&#xff0c;并且最近邻居之间有通道。k-ary n-c…