【C++】STL--stack

news2024/10/24 4:34:59

1. stack的介绍

stack的文档介绍 

后进先出(LIFO):Stack容器遵循后进先出的原则,即最后进入栈的元素最先被移出栈。

2.stack的使用

常用的几个接口 

代码演示如下 

int main()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	st.push(5);
	cout << st.size() << endl;
	cout << st.top() << endl;
	st.pop();
	cout << st.top() << endl;
	cout << st.empty() << endl;
	return 0;
}

3.stack的模拟实现

从栈的接口中可以看出,栈实际是一种特殊的vector,因此使用vector完全可以模拟实现stack。

#pragma once
#include <deque>
namespace xc
{
	template <class T,class Container = deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		const T& top()const
		{
			return _con.back();
		}
		void pop()
		{
			_con.pop_back();
		}
		size_t size()const
		{
			return _con.size();
		}
		bool empty()const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

4.OJ练习题

4.1最小栈

题目链接:最小栈

题目描述:

思路:题目要求我们在常数时间内检索到最小元素的栈,所以遍历一遍找肯定不行,我们可以用两个栈,一个栈用来模拟出栈入栈(_st)一个用来存放最小值(_minst),大概思路就是先插入一个数据然后让入栈元素和_minst的栈顶元素进行比较如果_minst为空或者入栈元素小于等于_minst就push到最小栈也就是_minst,出栈时如果_st的出栈元素等于_minst则_minst就出栈。

参考代码

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) {
        _st.push(val);
       if(_minst.empty() || val <= _minst.top())
       {
            _minst.push(val);
       }

    }
    void pop() {
        if(_st.top() == _minst.top())
        {
            _minst.pop();
        }
        _st.pop();
    }
    
    int top() {
        return _st.top();
    }
    
    int getMin() {
        return _minst.top();
    }
private:
    stack <int> _st;
    stack <int> _minst;
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

4.2 栈的压入、弹出序列

题目链接:栈的压入、弹出序列

题目描述:

思路:我们可以创建一个栈名为st然后将入栈数据依次push进去,push一个元素我们就拿它和出栈序列比较如果相等我们就将st里面的元素pop掉直到st为空或者不相等,然后继续push以此内推直至入栈元素全push进去了,最后判断st是否为空,为空就匹配上了返回true。

参考代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pushV int整型vector 
     * @param popV int整型vector 
     * @return bool布尔型
     */
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
      stack<int> st;
      size_t popi = 0;
     for(auto e:pushV)
     {
        st.push(e);
        while(!st.empty() && st.top() == popV[popi])
        {
            ++popi;
            st.pop();
        }
     }
     return st.empty();
     
    }
};

4.3 用栈实现队列

题目链接:用栈实现队列

题目描述:

思路:栈是后进先出,那么我们可以创建两个栈来实现一个队列,一个插入数据一个用来导数据,当我们要出栈时我们就把栈数据导到入到不为空的那个栈,比如1234我们要取出1就把数据导一下变成4321然后进取栈顶数据即可

参考代码

class MyQueue {
public:
    MyQueue() {

    }
    
    void push(int x) {
        st1.push(x);
    }
    
    int pop() {
    
       while(st2.empty())
       {
            while(!st1.empty())
            {
                int x = st1.top();
                st1.pop();
                st2.push(x);
            }
       }
       int x = st2.top();
       st2.pop();
       return x;
    }
    
    int peek() {
      while(st2.empty())
       {
            while(!st1.empty())
            {
                int x = st1.top();
                st1.pop();
                st2.push(x);
            }
       }

       return st2.top();
    }
    
    bool empty() {
        return st1.empty() && st2.empty();
    }
private:
    stack<int> st1;
    stack<int> st2;
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

总结

C++ STL中的stack是一种非常有用的容器适配器,它提供了简单而高效的后进先出数据结构。通过封装特定的容器类,stack能够灵活地适应不同的应用场景。虽然stack的访问受限,但这正是其设计初衷的一部分,以确保数据的正确性和安全性。因此,在需要后进先出数据结构的场景中,stack是一个非常好的选择。

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

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

相关文章

一句话木马的多种变形方式

今天来和大家聊一聊&#xff0c;一句话木马的多种变形方式。 经常有客户的网站碰到被上传小马和大马&#xff0c;这里的“马”是木马的意思&#xff0c;可不是真实的马。 通常&#xff0c;攻击者利用文件上传漏洞&#xff0c;上传一个可执行并且能被解析的脚本文件&#xff0c;…

软件测试之基础的“管理岗”

1、是否需要选择管理岗&#xff1f; 建议&#xff1a;如果个人有机会成为管理岗&#xff0c;那就抓紧了。 原因很简单&#xff0c;我认为市场的行业发展是这个样子的&#xff0c;专业化的技术人员一定是市场缺失的人才&#xff0c;但是相比较而言&#xff0c;管理者会更加被公…

实验室信息系统(LIS)源码,.Net C#语言开发C/S架构,支持DB2,Oracle,MS SQLServer等主流数据库

实验室管理信息系统LIS从属于HIS系统&#xff0c;严格意义上讲&#xff0c;它是HIS系统的一个子系统。众所周知的是&#xff0c;LIS系统的主要功能是将检验仪器传出的检验数据经分析后&#xff0c;生成检验报告&#xff0c;通过网络存储在数据库中&#xff0c;使医生能够方便、…

Adobe Photoshop 2025(PS2025版) v26.0.0.26 中文版新功能特色

Photoshop 2025 是一款图像处理软件&#xff0c;它提供了许多强大的功能和工具&#xff0c;使用户能够对图像进行编辑、调整、修复、合成和设计。 Adobe Photoshop 2025新功能特色 图像编辑&#xff1a;支持各种图像编辑功能&#xff0c;如裁剪、调整色彩、修复照片、添加滤镜…

根据指定键对自定义 JSON 输出

要根据指定键对自定义 JSON 进行输出&#xff0c;通常的做法是&#xff1a; 解析 JSON 数据。按照用户给定的键提取或排序数据。重新构造并输出 JSON 数据。 这里有几个常见的场景&#xff1a; 提取特定键及其值。按特定键排序 JSON 数组。过滤掉不需要的键。 接下来&#…

华为FreeBuds 6i开降噪后底噪声大该如何解决?

华为FreeBuds 6i开了降噪会有沙沙的底噪声&#xff1f;最近看到一些小伙伴说这款耳机降噪效果比较好&#xff0c;但有时候在安静的环境下可以听到沙沙的底噪声&#xff0c;这是怎么回事&#xff1f; 我们先来聊一下降噪的原理&#xff1a;耳机内部的降噪系统通过麦克风采集外界…

智慧园区防护系统——提升园区安全性的关键工具

伴随着城市现代化推进&#xff0c;智慧园区已经成为当代城市基本建设不可或缺的一部分。智慧园区综合服务管理系统软件也被视为园区安全高效的关键工具之一。本文将从智慧园区安全性系统设计、作用、运用等多个方面详细的表述与分析。 一、设计 智慧园区防护系统设计方案应依据…

AI帮你读取总结数百个页面,AI搜索——未来的搜索引擎

AI搜索 引言实践测试kimi测试智谱测试 思考总结 引言 之前OpenAI O1刚上线时&#xff0c;就已称模型在使用COT思维链进行推理和自我反思后可以大大提升模型能力。最近Kimi和智谱都在内侧推出了AI搜索&#xff0c;使用下来感觉效果非常炸裂。AI通过COT思维链拆解你的问题 快速…

云原生后端技术:构建高可靠、可扩展的现代应用

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

iPhone变身健康卫士,假期作息紊乱不再怕

由于长假&#xff0c;许多人的作息时间表可能已经完全被打乱。晚上熬夜追剧、白天睡到自然醒&#xff0c;这样的生活虽然惬意&#xff0c;但对我们的身体健康却是个不小的挑战。幸运的是&#xff0c;iPhone手机内置的一系列健康功能&#xff0c;可以帮助我们重新找回规律的生活…

布隆过滤器原理及优缺点详解!

文章目录 引言工作原理示例展示优缺点优点缺点 使用场景总结 引言 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于判断一个元素是否属于一个集合。它特别擅长处理大规模数据的快速查找&#xff0c;具有高效的空间利用率和查询速度。下面…

Flutter应用解析(一)

1、创建项目 1.1 新建 1.2 选择Flutter SDK的位置 1.3 项目名称 英文单词加下划线起名规范&#xff0c;其他默认即可。 1.4 点击运行 发生报错显示我们的JAVA版本不符合 1.5 更改版本设置 1.6 再次启动项目 2、分析页面代码 以下是lib/main.dart的源代码&#xff08;为了阅…

论文中如何引用羲和的气象数据呢?

最近许多小伙伴在问“论文中使用了羲和能源气象大数据平台的数据&#xff0c;该怎么引用?”今天来给大家解答一下羲和的数据是否可靠以及在论文中的引用格式该如何表示。 羲和数源&#xff1a; 由南京图德科技有限公司自主研发&#xff0c;与美国国家航天局(NASA)、欧洲中期天…

Kubernetes最全详解,这真得收藏

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友 随着云计算的快速发展&#xff0c;容器技术成为了现代软件开发不可或缺的一部分。容器化技术&#xff0c;尤其是…

基于Asp.Net的校园报修信息系统的设计与实现---附源码54880

内容摘要 在当今数字化校园的背景下&#xff0c;为了提高校园报修管理的效率和便捷性&#xff0c;设计并实现了一个基于 Asp.Net 的校园报修信息系统。该系统旨在解决传统报修方式中存在的繁琐、低效和不及时等问题&#xff0c;为师生提供一个快速、准确、可靠的报修平台。 本系…

three.js 实现一个心形的着色器

three.js 实现一个心形的着色器 源链接&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyshader&idheartShader 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z258630027…

天若OCR识别软件 使用教程 软件下载

F4&#xff08;FnF4&#xff09;快捷键打开软件&#xff0c;找到要识别的图片&#xff0c;直接选中要识别的区域&#xff0c;可直接识别出来。 如果识别失败&#xff0c;就在右键菜单里&#xff0c;重新识别

数据管理,数据治理,数据中心,数据中台,数据湖都是什么意思,有什么关系?

这些术语都与数据管理和处理相关&#xff0c;但它们各自关注的方面不同。下面我将逐一解释这些概念&#xff0c;并简要说明它们之间的关系。 数据管理 (Data Management) 数据管理是指规划、控制和提供数据及信息资产的过程。它包括了数据的获取、验证、存储、保护以及加工等一…

论文翻译 | LARGE LANGUAGE MODELS ARE HUMAN-LEVELPROMPT ENGINEERS

摘要 通过在自然语言指令上进行调节&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经展现出了作为通用计算机的惊人能力。然而&#xff0c;任务表现很大程度上取决于用于引导模型提示的质量&#xff0c;而最有效的提示通常是由人工精心设计的。受到经典程序合成和人类…

ppt在线生成工具有哪些?6个好用的做ppt软件盘点!

现代PPT作为工作和学习中的信息传递与展示工具&#xff0c;已被广泛使用。在商业或学术场景中&#xff0c;一个具备出色设计和内容的PPT幻灯片&#xff0c;能够最大限度吸引观众目光&#xff0c;同时提升信息传达效果。 然而同样不容忽视的是&#xff0c;传统的制作过程耗费时…