C++STL库中stack

news2024/10/6 0:34:08

 


文章目录

  • stack的介绍
  • stack的常用接口
  • stack的模拟实现
  • 关于栈的相关OJ题


一、stack的介绍

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

 

二、stack的常用接口

函数说明                                                                                 接口说明
stack()                                                                                  构造空的栈
empty()                                                                          检测stack是否为空
size()                                                                             返回stack中元素的个数
top()                                                                                  返回栈顶元素的引用
push()                                                                          将元素val压入stack中
pop()                                                                           将stack中尾部的元素弹出
swap()                                                                        交换两个容器的内容      

相关接口演示:

#include <iostream>
#include <stack>

int main()
{
	std::stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	
	while (!st.empty()) {
		std::cout << st.top() << " ";
		st.pop();
	}

	return 0;
}

三、stack的模拟实现

#pragma once

namespace Stack
{
	//这里默认是采用deque这种适配器来模拟栈
	template<class T,class Contain=std::deque<T>>
	class stack
	{
	public:
		/*
		stack()//这里不需要显示写构造函数,因为是自定义类型,直接调用默认构造函数就行
		{}
		*/

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

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

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

		void push(const T& val)
		{
			_con.push_back(val);
		}

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

		void swap(stack<T, Contain>& st)
		{
			std::swap(_con, st._con);
		}

	private:
		Contain _con;

	};
}

四、关于栈的相关OJ题

1.最小栈OJ链接

本题思路:设置一个辅助栈一个最小栈即可解决问题。

class MinStack {
private:
    stack<int> minST;
    stack<int> tmpST;
public:
    MinStack() {

    }
    
    void push(int val) {
        tmpST.push(val);

        if(minST.empty()||minST.top()>=val)
            minST.push(val);
    }
    
    void pop() {
        if(tmpST.top()==minST.top()){
            tmpST.pop();
            minST.pop();
        }
        else 
        tmpST.pop();
    }
    
    int top() {
        return tmpST.top();
    }
    
    int getMin() {
        return minST.top();
    }
};

/**
 * 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();
 */

2.栈的压入、弹出序列OJ链接

本题思路:本题利用

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.size()!=popV.size())//前言如果不满足这两个条件则直接返回false
        return false;
        if(pushV.empty()||popV.empty())
        return false;
        stack<int> ST;//创建出来一个栈
        int i,j=0;
        for(i=0;i<pushV.size();i++)//将压栈数组插入到栈中
        {
            ST.push(pushV[i]);
            while(!ST.empty()&&ST.top()==popV[j])//循环进行遍历操作,如果此时的popV[j]==ST.top(),则出栈
            {
                ST.pop();
                j++;
            }
        }
        if(!ST.empty())
        return false;
        return true;
    }
};

3.逆波兰表达式求值OJ链接

本题思路:由于该题时后缀表达式,所以从左往右计算利用操作符就开始计算然后将结果入栈即可。

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<string> stk;

        for(auto&str:tokens){
            if(str=="+"){
                int x=stoi(stk.top());
                stk.pop();
                int y=stoi(stk.top());
                stk.pop();
                auto sum=[](int x,int y){
                    return x+y;
                };
                stk.push(to_string(sum(x,y)));
            }  
            else if(str=="-"){
                int x=stoi(stk.top());
                stk.pop();
                int y=stoi(stk.top());
                stk.pop();
                auto sub=[](int x,int y){
                    return y-x;
                };
                stk.push(to_string(sub(x,y)));
            }
            else if(str=="*"){
                int x=stoi(stk.top());
                stk.pop();
                int y=stoi(stk.top());
                stk.pop();
                auto mul=[](int x,int y){
                    return x*y;
                };
                stk.push(to_string(mul(x,y)));
            }            
            else if(str=="/"){
                int x=stoi(stk.top());
                stk.pop();
                int y=stoi(stk.top());
                stk.pop();
                auto div=[](int x,int y){
                    return y/x;
                };
                stk.push(to_string(div(x,y)));
            } 
            else {
                stk.push(str);
            }
        }

        return stoi(stk.top());
    }
};

4.用栈实现队列OJ链接

本题思路:利用两个栈,一个栈用来出数据,一个用来入数据

class MyQueue {
    //定义两个栈一个栈用来出数据,一个栈用来插入数据
private:
     stack<int> PushST;
     stack<int> PopST;
public:
    MyQueue() {

    }
    //将数据放入插入数据的栈中
    
    void push(int x) {
           PushST.push(x);

    }
    //如果此时出数据的栈空为空时则将数据导入出数据的栈中
    
    int pop() {
        if(PopST.empty())
        {
            while(!PushST.empty())
            {
                PopST.push(PushST.top());
                PushST.pop();
            }
            
        }
        int ret=PopST.top();
        PopST.pop();
        return ret;

    }
    
    int peek() {
    if(PopST.empty())
        { while(!PushST.empty())
            {
                PopST.push(PushST.top());
                PushST.pop();
            }
           

    }
     return PopST.top();
    }
    
    bool empty() {
        return PushST.empty()&&PopST.empty();

    }
};

/**
 * 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();
 */

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

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

相关文章

英文论文(sci)解读复现:基于YOLOv5的自然场景下苹果叶片病害实时检测

对于目标检测算法改进&#xff0c;但是应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的SCI论文&#xff0c;并对…

FitBot-一款先进的以健康为中心的聊天机器人

在健康意识高涨&#xff0c;追求均衡生活方式成为普遍追求的时代&#xff0c;营养问题无疑是核心支柱。然而&#xff0c;饮食计划的复杂性和大量的营养数据往往成为我们实现这种平衡的障碍。例如糖尿病患者&#xff0c;他们需要持续和准确的营养指导来有效管理血糖水平。如果能…

Mendix是如何支持多语言的?

前言 国际化的支持能力&#xff0c;至关重要。这类功能的缺失&#xff0c;将会在市场竞争、用户体验、合作关系以法律法规方面遇到重大挑战&#xff0c;这些都是可能对其成功产生致命影响的问题。 比如在某些国家和地区&#xff0c;政府可能会对不支持本地语言和货币的软件系…

深度学习,神经网络介绍

目录 1.神经网络的整体构架 2.神经网络架构细节 3.正则化与激活函数 4.神经网络过拟合解决方法 1.神经网络的整体构架 ConvNetJS demo: Classify toy 2D data 我们可以看看这个神经网络的网站&#xff0c;可以用来学习。 神经网络的整体构架如下1&#xff1a; 感知器&…

el-table使用xlsx实现导入文件编辑功能

需求&#xff1a;列表根据xlsx文件导入后&#xff0c;和列表进行对比&#xff0c;之后实现编辑功能 1.下载xlsx 我下的是之前的版本&#xff0c;新版不知道兼不兼容&#xff0c;这个包900多k npm install xlsx0.14.5 2.在需要使用表格导入的页面引入 import XLSX from &quo…

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】 1 实现\封装Message模块 zinx/ziface/imessage.go package zifacetype IMessage interface {GetMsdId() uint32GetMsgLen() uint32GetMsgData() []byteSetMsgId(uint32)SetData([]byte)SetData…

MySQL数据库 【索引事务】

目录 一、概念 二、索引的优缺点 1、索引的优点 2、索引的缺陷 三、索引的使用 1、查看索引 2、创建索引 3、删除索引 四、索引底层的数据结构 1、B树 2、B树 五、索引事务 1、概念和回滚 2、事务的使用 3、事务的基本特性 4、并发会遇到的问题 &#xff08…

Python程序设计基础:字典与集合(二)

文章目录 一、字典的整体操作1、字典的遍历2、字典的排序3、字典的合并 二、创建与访问集合1、集合的创建2、集合的访问 三、集合的基本操作1、集合的增、删、查2、集合的数学运算 一、字典的整体操作 字典的整体操作是指以字典为操作对象&#xff0c;对字典进行遍历、排序以及…

hdu foreverlasting and fried-chicken

题意&#xff1a; 在一个有n个点和m条边的图中找到形状是上图的子图&#xff0c;输出个数 思路&#xff1a; 仔细观察上图&#xff0c;设第二行的那个点为x&#xff0c;最后一行的点为y&#xff0c;那么可以知道&#xff0c;如果x和y都和相同的所有点中取四个点分别和xy相连…

DUBBO服务多网卡,服务调用失败

如果服务器是多网卡的&#xff0c;比如安装了docker&#xff0c;有一个docker虚拟网卡&#xff0c;一个实体网卡eth0&#xff0c;当我们运行springboot应用后&#xff0c;dubbo注入到zk的地址是 docker虚拟网卡的地址172网段&#xff0c;而不是实际内网地址192网段&#xff0c;…

OpenLayers实战,OpenLayers使用wind-layer插件实现风场动态效果

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解如何使用OpenLayers的气象风场插件wind-layer实现气象风场动态效果,该插件除了可用于OpenLayers之外,还可用于mapgl、leaflet和cesuim等二维/三维地图引擎,还是很强大的,废话少谈,让我们立刻开始实现吧。 二、依赖和…

如何将论文中的字快速复制出来?图片如何提取文字?

在日常的办公中&#xff0c;我们经常会遇到需要将纸质文件里的文字提取出来&#xff0c;再转换为电子档的情况&#xff0c;如果我们采用手动输入的话&#xff0c;不仅速度太慢&#xff0c;而且还可能因此耽误到后边的工作&#xff0c;是不是已经有小伙伴遇到这种现象&#xff0…

element中tabs组件,click事件点击拿到当前item的所有数据

话不多说&#xff0c;直接上代码&#xff1a; 添加一个:value&#xff0c;然后在用JSON.stringify(item)转一下就可以了&#xff0c;这样就会存在$attrs.value这个里面了。 接着在点击事件里面获取使用el.$attrs.value&#xff0c;注意这里在拿到这个值时&#xff0c;再用JSON…

锌离子荧光探针TSQ,109628-27-5,具有很好的选择性荧光探针

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----外观以及性质&#xff1a; 锌离子荧光探针TSQ&#xff08;CAS号&#xff1a;109628-27-5&#xff09;&#xff0c;锌离子荧光探针TSQ是用于检测锌离子的荧光探针。 TSQ与Zn离子结合后&#xff0c;吸收波长和发射波…

如何创建一个SpringBoot项目

欢迎来到南方有乔木的博客&#xff01;&#xff01;&#xff01; 博主主页&#xff1a;点击点击&#xff01;戳一戳&#xff01;&#xff01; 博主名:南方有乔木 博主简介&#xff1a; 一名在校大学生&#xff0c;正在努力学习Java语言编程。穷且意坚&#xff0c;不坠青云之…

sort排序报错:java.lang.UnsupportedOperationException: null

文章目录 问题原因解决方式 问题 Groovy 调用 .sort{} 排序报错:java.lang.UnsupportedOperationException: null solutionScenario2SolutionProcessList.sort { it.idx } 原因 调用的sort的对象是Collections的内部类对象UnmodifiableRandomAcessList 解决方式 调用 coll…

数据结构:单链表的实现(C语言)

个人主页 &#xff1a; 水月梦镜花 个人专栏 &#xff1a; 《C语言》 《数据结构》 文章目录 前言一、单链表实现思路和图解1.节点的定义(SListNode)2.申请一个节点(BuySListNode)3.单链表打印(SListPrint)4.单链表尾插(SListPushBack)5.单链表的头插(SListPushFront)6.单链表的…

【ChatGPT辅助学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一&#xff0c;创建项目二&#xff0c;两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时&#xff0c;都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中&#xff0c;将会介绍如何在Rust中编写并运…

音频编辑必备技能:怎么将音频转换mp3

丽萨&#xff1a;嘿&#xff0c;听说你最近在研究音频格式转换的方法&#xff0c;有眉目了吗&#xff1f; 凯瑞&#xff1a;没错&#xff0c;我下载了很多高清音乐&#xff0c;发现有些格式的音频文件在我的播放器上打不开&#xff0c;所以想一个转换工具。但是网上软件太多&a…

使用腾讯云 Cloud studio 实现调度百度AI实现文字识别

文章目录 前言导入模块设置百度AI的APP_ID、API_KEY和SECRET_KEY定义路径和文件列表打开文本文件准备写入数据逐个处理图片文件关闭文本文件重复处理其他图片文件完整代码解释说明 运行效果 前言 今天我们也来高大上一下&#xff0c;玩一把人工智能。那就是免费调用百度AI实现图…