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

C++stack

目录

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.xdnf.cn/news/11592.html

相关文章:

  • lua入门(1) - 基本语法
  • 成成你好呀笔记整理(知识点合集三)
  • 如何理解鲁棒性?为什么robustness会翻译为鲁棒性?
  • Android :这是一份详细 全面的 SQLlite数据库 使用手册
  • vuex介绍及使用指南(面向实战)
  • Prometheus基本原理和使用
  • 男人最爱丰满女人
  • ELK日志分析系统
  • SVG基础知识
  • Spark是什么
  • Navicat Premium数据库管理工具安装教程
  • cron表达式详解
  • 介绍一个超好用的API管理工具:Apipost
  • 【Eclipse安装及使用(面向小白)】
  • Kafka介绍
  • 什么是IP?
  • 案例分享:建设企业网上办公综合平台
  • 四季度组内定期技术与架构思维交流会 Kaki的博客
  • PHP8 编程提示(二)
  • 系统提示缺少或找不到d3dcompiler_43.dll文件的详细修复教程
  • 深度学习人脸识别基础
  • 操作系统期末总结
  • oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等)
  • J-Link:STM32使用J-LINK烧录程序,其他MCU也通用
  • Ubutun常用命令之chmod
  • 浅议C++ 中的垃圾回收方法
  • 斯坦福的parser学习--
  • SSM教师教学质量评价系统 计算机毕设源码77614
  • 给网站、博客文章添加阅读次数统计,我用两行代码 搞定计数
  • 关于学习 unity3D 的知识预储备