C++stack

news2024/12/26 21:03:29

目录

1.什么是stack

2.容器适配器

3.stack的使用

top

push

 pop

 

4.模拟实现stack


1.什么是stack

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

2.容器适配器

容器适配器(Container Adapters)是 C++ 标准库提供的一种数据结构,它们基于现有的容器类型,提供了特定的接口和功能,以便更方便地实现某些特定的数据结构和算法。容器适配器本质上是对底层容器的封装,提供了不同的数据访问方式,使它们适用于特定的用途。 

标准库中提供了三种常用的容器适配器:

stack:栈适配器,基于底层容器提供了栈数据结构的操作,如压入(push)、弹出(pop)、查看栈顶元素等。默认底层容器是 deque,但也可以使用其他支持 back() 和 push_back() 操作的容器。


queue:队列适配器,基于底层容器提供了队列数据结构的操作,如入队(push)、出队(pop)、查看队首元素等。默认底层容器是 deque,但也可以使用其他支持 back() 和 push_back() 操作的容器。


priority_queue:优先队列适配器,基于底层容器提供了优先队列数据结构的操作,支持在插入元素时根据优先级进行排序。默认底层容器是 vector,但也可以使用其他支持随机访问和插入操作的容器。

3.stack的使用

这些是C++标准库中stack类的构造函数声明。stack是一个适配器容器,它可以使用不同的底层容器来实现栈的功能。这些构造函数声明提供了不同的方式来创建和初始化stack对象,可以根据需求选择合适的构造函数。 

stack的Construct中除了构造函数,其他什么都没有,它连拷贝构造、析构都没有。这个也跟它是容器适配器有关系,因为它的成员都是自定义类型,编译器默认生成的就够用。

stack是容器适配器以后,就开始不支持迭代器了。容器支持迭代器,容器适配器不支持迭代器。

栈随便去遍历反而是不好的,因为要保证后进先出的性质。

所以取数据得用top,想取下一个数据就得先pop。

top

reference top(); 和 const_reference top() const; 是 C++ 标准库中 std::stack 类的成员函数之一。它们用于获取栈顶元素的引用。

reference top();:返回栈顶元素的引用。如果需要修改栈顶元素,可以使用这个版本。

#include <iostream>
#include <stack>

		stack<int> m;

		m.push(42);
		m.push(15);

		// 使用 top() 获取栈顶元素
		int topElement = m.top();
		cout << "Top element: " << topElement << endl;

		// 修改栈顶元素
		m.top() = 99;
		cout << "New top element: " << m.top() << endl;

		return 0;
	

}

 

后进先出,15先出,然后修改为99,最后出99

push

是 C++ 标准库中 std::stack 类的成员函数之一。它们用于将一个新的元素压入栈中。

这两个版本的 push 函数允许你在栈顶添加新的元素。如果需要保持传入值的不变性,可以使用第一个版本;如果你想利用移动语义来避免不必要的复制,可以使用第二个版本。
#include<iostream>
#include<stack>
using namespace std;


	int main() 
	{
		stack<int> m;

		m.push(10); // 使用右值,将 10 压入栈中
		m.push(19);

		int newElement = 99;
		m.push(newElement); // 使用常量引用,将 newElement 压入栈中

		cout << "Stack size: " << m.size() << endl;

		while (!m.empty())  // 遍历不能用迭代器,容器适配器不支持迭代器
		{
			cout << m.top() << " "; // 输出栈顶元素
			m.pop(); // 弹出栈顶元素
		}

		return 0;
	}

 pop

void pop(); 是 C++ 标准库中 stack 类的成员函数之一。它用于将栈顶元素弹出(删除)。

这个函数没有返回值,它只是从栈中移除栈顶元素。在调用 pop() 函数之前,需要确保栈不为空,否则会导致未定义行为。

	int main() 
	{
		stack<int> m;

		m.push(10); // 使用右值,将 10 压入栈中
		m.push(19);
		m.push(29);

		cout << "Stack size: " << m.size() << endl;

		m.pop();

		cout << "Stack new size: " << m.size() << endl;

		return 0;
	}

4.模拟实现stack

STL(标准模板库)中的 stack 和 queue 默认使用 std::deque 作为底层容器的原因是出于性能和功能的考虑。

std::deque(双端队列)是一个双向开口的动态数组,支持在队首和队尾进行高效的插入和删除操作。它的内部实现使得在队首和队尾的操作都能达到接近常数时间复杂度,这使得 std::deque 在作为底层容器时能够提供较好的性能
 

实现代码

#pragma once

#include "string.h"
#include<iostream>
#include<stack>
#include<deque>


using namespace std;


namespace lty
{
	//适配器模式
	template<class T, class Container=deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_back();
		}

		const T& top()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}

	private:
		Container _con;
	};

	void test_stack()
	{
		stack<int, deque<int>> st;
		st.push(1);
		st.push(2);
		st.push(3);
		st.push(4);

		while (!st.empty())
		{
			cout << st.top() << " ";
			st.pop();
		}
		cout << endl;
	}
}

测试代码

#include "string.h"


int main()
{
	lty:: test_stack();
}

结果

头文件包含:代码首先包含了头文件 <deque>,这是为了使用底层容器 std::deque。

命名空间定义:代码将 stack 类放置在了命名空间 lty下,这是为了避免命名冲突和提供代码的组织结构。

stack 类模板定义:stack 类是一个模板类,有两个模板参数:T 表示栈中存储的元素类型,Container 表示底层容器的类型,默认为 std::deque<T>。

公共成员函数

push(const T& x):将传入的元素值 x 添加到底层容器的末尾,实现了入栈操作。


pop():从底层容器的末尾删除一个元素,实现了出栈操作。


T& top() 和 const T& top() const:分别返回底层容器的末尾元素的引用(允许修改)和常量引用(只读),实现了查看栈顶元素操作。


bool empty() const:返回底层容器是否为空。


size_t size() const:返回底层容器中元素的数量。


私有成员变量 _con:这是一个模板类的私有成员变量,用于存储实际的栈元素。其类型是根据模板参数 Container 确定的,在实例化时会被替换为具体的容器类型。

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

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

相关文章

进程间通信方式——管道

进程间通信方式——管道 1、管道2、匿名管道2.1 创建匿名管道2.2 进程间通信 3、有名管道3.1 创建有名管道3.2 进程间通信 4、管道的读写行为 原文链接 1、管道 管道的是进程间通信&#xff08;IPC - InterProcess Communication&#xff09;的一种方式&#xff0c;管道的本质…

深入 C 语言和程序运行原理 实战项目代码在CentOS 7上编译

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64。 安装gtest 参考博客《使用gtest和lcov测试代码覆盖率》 wget https://github.com/google/googletest/archive/refs/…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

Promise的resolve和reject方法(手写题)

1.resolve 2.reject 3.手写 1.resolve //构造函数上添加 resolve 方法 Promise.resolve function (value) {return new Promise((resolve, reject) > {if (value instanceof Promise) {value.then((val) > {resolve(val)},(err) > {reject(err)})} else {resolve(v…

国内首所国际职业培训学院落户深圳盐田揭幕开业

11月26日&#xff0c;中科国药•中科大有大健康上市企业孵化平台迎来了国内首所国际职业学院——深圳市盐田区国际职业培训学院的正式落成与揭幕仪式。中科大有高新科技有限公司董事长、长江商学院MBA\FMBA金融导师、深圳市中科国药生物医药研究院理事长、深圳市盐田区国际职业…

HarmonyOS到底有哪些独特之处?你真正了解鸿蒙多少!

鸿蒙系统太炸裂了&#x1f4a5;我已经后悔了&#x1f62d;后悔没早点学习鸿蒙 HarmonyOS 概念&#xff0c;系统定位 1&#xff1a;鸿蒙系统是由华为公司自主研发的全球化开放源代码操作系统&#xff0c;它具有以下特别之处&#xff1a; 2&#xff1a;分布式架构&#xff1a;…

华为鸿蒙工程师成“热门”!最高年薪160万,只看技术不看年龄

引言&#xff1a; 今天&#xff0c;在互联网行业&#xff0c;超过30岁的工程师往往被认为是“码农”的生命周期终点。然而&#xff0c;华为鸿蒙系统的崛起&#xff0c;却再次给予了这些35岁以上的工程师们第二春的机会。国内一线互联网公司纷纷向鸿蒙系统靠拢&#xff0c;导致…

c语言练习13周(1~5)

输入任意整数n求以下公式和的平方根。 读取一系列的整数 X&#xff0c;对于每个 X&#xff0c;输出一个 1,2,…,X 的序列。 编写double fun(int a[M][M])函数&#xff0c;返回二维数组周边元素的平均值&#xff0c;M为定义好的符号常量。 编写double fun(int a[M])函…

设计模式-结构型模式之桥接设计模式

文章目录 三、桥接模式 三、桥接模式 桥接模式&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得实体类…

Unity 使用Horizontal Layout Group和Toggle制作多个水平开关按钮实现自动排列和单个点击放大后的自动排列。

Unity的布局组件Horizontal Layout Group是很好用的&#xff0c;当然也包括其它布局组件也一样好用。 比如要实现多按钮开关自动水平排列&#xff0c;那么就可以使用它了。 首先我们为按钮创建个父物体&#xff08;我这里使用了Scroll View中的Content作为父物体&#xff09;…

elementUI实现根据屏幕大小自适应换行,栅格化布局

需求&#xff1a; 默认一行展示4个卡片&#xff1b;当屏幕小于某个大小的时候&#xff0c;一行展示3个卡片&#xff1b;再小就展示2个&#xff1b;以此类推&#xff0c;最小就展示1个。 效果卡片样式如下图&#xff1a; 默认一行4个 屏幕缩小到某个阈值&#xff0c;一行展示…

11.26电梯控制器设计分析

项目三 电梯控制器设计&#xff08;*****&#xff09; 设计一个多楼层的电梯控制器系统&#xff0c;并能在开发板上模拟电梯运行状态。可以利用按键作为呼叫按键&#xff0c;数码管显示电梯运行时电梯所在楼层&#xff0c;led灯显示楼层叫梯状态。 就是初始默认在1楼&#xff0…

【LeetCode:1657. 确定两个字符串是否接近 | 计数 + 阅读理解】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19

一些原理文章 卷积神经网络基础&#xff08;卷积&#xff0c;池化&#xff0c;激活&#xff0c;全连接&#xff09; - 知乎 PyTorch 入门与实践&#xff08;六&#xff09;卷积神经网络进阶&#xff08;DenseNet&#xff09;_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…

Web 实时消息推送

Web 实时消息推送详解 什么是消息推送&#xff1f; 推送的场景比较多&#xff0c;比如有人关注我的公众号&#xff0c;这时我就会收到一条推送消息&#xff0c;以此来吸引我点击打开应用。 消息推送通常是指网站的运营工作等人员&#xff0c;通过某种工具对用户当前网页或移…

最小化安装 Neokylin7.0 用于搭建 Hadoop 集群

文章目录 环境搭建背景虚拟机创建和环境配置安装过程注意事项虚拟机设置软件选择KOUMP系统分区网络和主机名打开以太网&#xff0c;并记录信息配置 IPv4修改主机名 创建用户 hadoop完全分布式搭建-CSDN博客 环境搭建背景 为什么不从hadoop100或者hadoop101开始&#xff0c;而是…

引领数据趋势:2023年最值得关注的十大ETL数据集成工具

在这个数据至上的时代&#xff0c;对于以数据为驱动的组织来说&#xff0c;建立一个信息集中的强大源头是成功的关键。众多企业依靠ETL工具来管理和理解它们的数据。 ETL&#xff0c;即提取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;、加载&…

matlab基于线性二次调节器(LQR)法实现机器人路径规划可变轨迹跟踪

1、内容简介 略 可以交流、咨询、答疑 2、内容说明 基于线性二次调节器(LQR)法实现机器人路径规划可变轨迹跟踪 3、仿真分析 略 load path.mat %% 轨迹处理 % 定义参考轨迹 refPos_x path(:,1); refPos_y path(:,2); refPos [refPos_x, refPos_y];% 计算航向角和曲率 …

python的制图

测试数据示例&#xff1a; day report_user_cnt report_user_cnt_2 label 2023-10-01 3 3 欺诈 2023-10-02 2 4 欺诈 2023-10-03 6 5 欺诈 2023-10-04 2 1 正常 2023-10-05 4 3 正常 2023-10-06 4 4 正常 2023-10-07 2 6 正常 2023-10-08 3 7 正常 2023-10-09 3 12 正常 2023-…

【MySQL】MySQL安装 环境初始化

MySQL安装 MYSQL官网 安装完成后,傻瓜下一步即可 配置一下环境变量即可 (1) 初始化MySQL, 管理员身份运行 mysqld --initialize-insecure(2) 注册 mysqld mysqld -install# 如果记录以前的版本执行下面指令 mysqld -remove(3) 启动MySQL服务 // 启动mysql服务 net start …