C++ Stack栈学习

news2024/11/19 6:12:41

1. stack的介绍和使用

1.1 stack的介绍

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类

4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque

1.2 stack的使用

栈的方法,之前也进行过学习

实现最小栈

分析:最小栈1.必须有常规栈基本操作

2.提供或者栈中所有元素中最小值的操作0(1)

OJ练习

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) {
        dataStack.push(val);
        if(minStack.empty()||val<=minStack.top())
        {
             minStack.push(val);
        }    
    }
    
    void pop() {
        
        if(dataStack.top()==minStack.top())
        {
            minStack.pop();
        }
        dataStack.pop();
    }
    
    int top() {
        return dataStack.top();
    }
    
    int getMin() {
        return minStack.top();
    }
    stack<int> dataStack;//存放元素
    stack<int> minStack;//存放最小值
};

逆波兰表达式求值

作用:让计算机非常简单的计算四则混合运算

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> s;
        for(auto& e:tokens)
        {
            //判断是数字还是运算符
            if(!(("+"==e)||("-"==e)||("*"==e)||("/"==e)))
            {
                //如果是数字直接入栈
                s.push(atoi(e.c_str()));
            }
            else
            {
                //e是符号
                int right=s.top();
                s.pop();
                int left=s.top();
                s.pop();

                switch(e[0])
                {
                    //看看是那个符号
                    case'+':
                        s.push(left+right);
                        break;
                    case'-':
                        s.push(left-right);
                        break;
                    case'*':
                        s.push(left*right);
                        break;
                    case'/':
                        s.push(left/right);
                        break;
                }
            }
        }
        return s.top();
    }
};

入栈出栈次序检测

#include <vector>
class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        stack<int> s;
        size_t inidex=0,outidx=0;
        while(outidx<popV.size())
        {
            //栈是空或者栈顶元素与待出栈元素不相等时需要入栈
            while(s.empty()||s.top()!=popV[outidx])
            {
                //必须保证栈中还有元素
                if(inidex<pushV.size())
                {
                    s.push(pushV[inidex]);
                    inidex++;
                }
                else {
                    //还需要有元素入栈,但是pushV中已经没有元素了,所以肯定不匹配
                  return false;
                } 
            }
            s.pop();
            outidx++;    
        }  
        return true;
    }
};

2.stack的模拟实现

stack.h中

#pragma once
#include<iostream>
using namespace std;
#include<vector>

namespace zx
{
    //实现栈时候默认对vector进行了封装
    //container表示用来存储栈的那个容易
    template<class T,class Container= std::vector<T>>
    class stack
    {
    public:
        stack()
        {}

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

        void pop()
        {
            if (empty())
                return;

            c.pop_back();
        }

        T& top()
        {
            return c.back();
        }

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

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

        bool empty()const
        {
            return c.empty();
        }

    private:
        Container c;
    };
}

void TestMystack()
{
    zx::stack<int> s;
    s.push(1);
    s.push(8);
    s.push(6);
    s.push(99);
    s.push(55);
    s.push(15);

    cout << s.size() << endl;
    cout << s.top() << endl;
    
    s.pop();
    s.pop();
    cout << s.size() << endl;
    cout << s.top() << endl;
}

主函数中进行测试

#include<iostream>
using namespace std;
#include"Stack.h"

int main()
{
    void TestMystack();
    return 0;
}

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

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

相关文章

sync map思考

sync map 作为解决 map 并发读写问题的补充&#xff0c;用法上其实不复杂&#xff0c;有些惋惜的是&#xff0c;不支持 len 统计数量的方法。map 并发读写算得上一个非常严重的问题&#xff0c;会导致服务宕机&#xff0c;为了避免 map 的并发读写&#xff0c;一种解决办法是直…

华为机试题:HJ108 求最小公倍数(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

软件工程知识-软件测试

1、软件测试是发现软件错误&#xff08;缺陷&#xff09;的主要手段&#xff1a; 从是否关系软件内部结构和具体实现的角度对软件测试进行分类 2.静态测试&#xff1a;以检查为主&#xff08;桌前检查、代码走查、代码审查&#xff09; 动态测试&#xff1a;实际运行程序&am…

Leetcode刷题一

目录序言树「结构」「遍历」「经验」「跨父节点」「题型」序言 笔记根据labuladong进行总结&#xff0c;极力推荐labuladong算法进行学习&#xff01;&#xff01; 树 0、算法一开始就应该刷树&#xff0c;了解递归的思想。 1、C语言中定义了一个结构体&#xff0c;然后申明…

通过指针引用数组的几种方法的原理和差异;以及利用指针引用数组元素的技巧

关于地址&#xff0c;指针&#xff0c;指针变量可以参考这篇文章&#xff1a; 地址&#xff0c;指针&#xff0c;指针变量是什么&#xff1f;他们的区别&#xff1f;符号&#xff08;*&#xff09;在不同位置的解释&#xff1f;_juechen333的博客-CSDN博客https://blog.csdn.n…

nginx http模块

模块依赖2. 模块的初始化2.1 location的定义location的定义包含以下几种location [ | ~ | ~* | ^~ ] uri { ... } location name { ... }:表示精确匹配&#xff0c;只有请求的url路径与后面的字符串完全相等时&#xff0c;才会命中&#xff0c;不支持location嵌套~&#xff1a…

有免费的PDF转Word吗?值得收藏的7个免费 PDF转Word工具请收好

PDF 和 DOC 是人们在工作中广泛使用的两种最流行的文档格式。PDF 是 Adobe 的便携式文档格式&#xff0c;DOC 是 Microsoft 的 Word 文档格式。PDF 是一种更安全可靠的文件格式&#xff0c;因为它很难编辑 PDF 文件&#xff0c;但是有一些称为 PDF 编辑器的工具可用于编辑 PDF …

【Linux】工具(4)——make/Makefile

本期博客我们的任务就是搞懂自动化构建工具——make/Makefile一、什么是make/Makefile&#x1f4cc;make是一个命令工具&#xff0c;是一个解释makefile中指令的命令工具&#xff0c;一般来说&#xff0c;大多数的IDE都有这个命令&#xff0c;比如&#xff1a;Delphi的make&…

设计模式之创建型模式

一、设计模式分类二、创建型模式1、单例模式1.1 饿汉式&#xff08;静态变量&#xff09;1.2 饿汉模式&#xff08;静态代码块&#xff09;1.3 懒汉式&#xff08;线程不安全&#xff09;1.4 懒汉式&#xff08;线程安全&#xff0c;同步方法&#xff09;1.5懒汉式&#xff08;…

PHP语言

一、PHP简介 什么是 PHP&#xff1f; PHP 是强有力的服务器端脚本语言 PHP 是免费的&#xff0c;并且使用广泛 PHP能够包含文本、HTML、CSS以及PHP代码&#xff0c;在服务器上执行&#xff0c;结果以纯文本返回浏览器。PHP是从C和Perl发展而来的一种非常简单的语言&#xff…

考研流程,可以进来转一转(考研你不知道的事情)(详细版)

之前有听过好多人说要考研&#xff0c;那么&#xff0c;考研的信息&#xff0c;如何获取呢&#xff0c;考研都有哪些流程呢。 初试开始到考试&#xff1a;↓ 1、了解考研信息。 2、确定自己要报考的专业。&#xff08;本专业or跨考&#xff09; 3、选择地区 4、选择要报考的学…

TAURI初体验

TAURI初体验 - 一个聊天机器人demo前言一、搭建Tauri apps二、引入库相关vue库三、 业务逻辑1.页面布局2. openai的初始化3. text-davinci-003模型4.gpt-3.5-turbo模型总结前言 一直使用Electron开发桌面应用&#xff0c;时间长了也就腻了。很早之前就关注了Tauri&#xff0c;趁…

尚硅谷SpringCloud Alibaba

1. Cloud Alibaba简介2.Nacos简介和下载3.Nacos安装4.Nacos之服务提供者注册5.Nacos之服务消费者注册和负载6.Nacos服务注册中心对比提升7.Nacos之服务配置中心8.Nacos之命名空间分组和DataID三者关系9.Nacos之DataID配置10.Nacos之Group分组方案11.Nacos之Namespace空间方案12…

基于支持向量机SVM的分类预测,基于SVM的雷击故障识别

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的雷击故障分类预测 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空…

主流机器学习平台调研与对比分析

梗概 本报告主要调研目前主流的机器学习平台&#xff0c;包括但不限于Amazon的Sage maker&#xff0c;Alibaba的PAI&#xff0c;Baidu的PaddlePaddle。对产品的定位、功能、实践、定价四个方面进行详细解析&#xff0c;并通过标杆对比分析提出一套机器学习平台评价体系&#x…

案例总结之——redis缓存不一致的问题

1.是什么&#xff1f; Redis&#xff1a;Remote Dictionary Server&#xff0c;即远程字典服务 支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。Redis 是当前互联网世界最流行的 NoSQL&#xff08;Not Only SQL&#xff09;数据库…

js实现懒加载 最简单

实现前得先知道一下js里的几个高度&#xff1a; 视口高度&#xff1a;document.documentElement.clientHeight 滚动高度&#xff1a;document.documentElement.scrollTop || document.body.scrollTop 元素距离最顶端高度&#xff1a;dom元素.offsetTop 先说一下思路&#xff1…

k8s之list-watch,节点调度以及亲和性

一、list-watch机制1.1 list-watch介绍Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Po…

【mmdeploy部署系列】使用Tensorrt加速部署mmpose人体姿态库

【mmdeploy部署系列】使用Tensorrt加速部署mmpose人体姿态库0.引言1.安装mmcv2.使用mmpose&#xff08;1&#xff09;安装mmpose&#xff08;2&#xff09;运行mmpose3.使用mmdeploy&#xff08;1&#xff09;安装ppl.cv&#xff08;2&#xff09;编译安装mmdeploy&#xff08;…

【手把手一起学习】(八) Altium Designer 20修改和自定义原理图标题栏

1 修改原理图标题栏 直接对原理图标题栏属性进行修改&#xff0c;操作如图所示&#xff1a; 修改后&#xff0c;并不会显示&#xff0c;故该方法不可用&#xff1a; 正确的操作如下&#xff0c;先选择合适的模板&#xff1a; 然后&#xff0c;进行属性的修改&#xff1a; 此时…