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

Lesson11---stack

Lesson11—stack

c++stack的介绍使用以及模拟实现


文章目录

  • Lesson11---stack
  • 前言
  • 一、stack成员函数
    • 1.stack
    • 2.empty
    • 3.size
    • 4. top
    • 5.push
    • 6.pop
  • 二、stack相关题目
    • 1. 最小栈
    • 2.栈的压入、弹出序列
  • 三、模拟实现
  • 总结


前言

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

stack的成员函数和前几期很像就简单的使用一下

一、stack成员函数

在这里插入图片描述

1.stack

构造一个栈这里无需初始化这里以及写好了构造函数在这里插入图片描述

2.empty

判断这个栈是不是空
空返回true
非空返回false
通常用来遍历这个栈
栈没有提供范围for

oid test1()
{stack<int> s;s.push(1);s.push(2);s.push(3);s.push(4);s.push(5);while (!s.empty()){cout << s.top() << ' ';s.pop();}
}

3.size

有了前几章的基础这些都是秒懂
在这里插入图片描述

4. top

返回栈顶的元素
在这里插入图片描述

5.push

栈是先进后出

void test1()
{stack<int> s;s.push(1);s.push(2);s.push(3);s.push(4);s.push(5);while (!s.empty()){cout << s.top() << ' ';s.pop();}
}

在这里插入图片描述

6.pop

出栈其实和尾删差不多
在这里插入图片描述

二、stack相关题目

1. 最小栈

https://leetcode.cn/problems/min-stack/description/
在这里插入图片描述

在这里插入图片描述
这道题的要求就是返回栈的最小值但是这里时间复杂度要求比较高,这里采用俩个栈来实现

class MinStack {
public:MinStack() {}void push(int val) {}void pop() {}int top() {}int getMin() {}
};/*** 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();*/

这是题目给的初始代码,这里构造不自己写了,直接删掉走默认构造

class MinStack {
public:void push(int val) {_st.push(val);if(_minst.empty() || val<= _minst.top()){_minst.push(val);}}void pop() {if(_minst.top() == _st.top()){_minst.pop();}_st.pop();}int top() {return _st.top();}int getMin() {return _minst.top();}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();*/

在这里插入图片描述

2.栈的压入、弹出序列

https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&&tqId=11174&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
在这里插入图片描述

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 index=0;for(auto e:pushV){st.push(e);while (!st.empty() && popV[index] == st.top()) {index++;st.pop();}}return st.empty();}
};

三、模拟实现

#pragma once
template<class T>
class my_stack
{
private:T* _a;int _top;int _capacity;
};

上面是原始人写法,现代人可以这样写

#pragma once
#include<bits/stdc++.h>
using namespace std;
template<class T,class container>
class my_stack
{
public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){return _con.back();}bool empty(){return _con.empty();}size_t size(){_con.size();}
private:container _con;
};
#define _CRT_SECURE_NO_WARNINGS 
#include"mystack.h"
using namespace std;
int main()
{my_stack<int, vector<int>> s;s.push(1);s.push(2);s.push(3);s.push(4);while (!s.empty()){cout << s.top() << " ";s.pop();}return 0;
}

在这里插入图片描述

这里用俩个模板参数,栈可以用vector也可以用list,这里可以指定,甚至这里可以用list来弄
在这里插入图片描述
但是这里每次都要指定又太麻烦了,模板和函数参数一样都可以直接给缺省参数
在这里插入图片描述

在这里插入图片描述


总结

模板可以给缺省参数,有了模板这些实现就变得特别的灵活,函数给的是值,模板给的是类型


http://www.mrgr.cn/news/60059.html

相关文章:

  • centeros7 编译ffmpeg
  • 华为网络管理配置实例
  • OmniGen:AI图像生成新王者诞生
  • 基于centos7.9搭建在线购物网站
  • 数据结构:利用队列的基本操作,模拟病人到医院排队看病过程。
  • 三国杀钓鱼自动化
  • 启动MySQL报错,报日志找不到
  • STM32 f407 多通道ADC采集+DMA传输 基于HAL库和Cubemx配置
  • Android13 通过OTA升级更新系统默认设置
  • Renesas R7FA8D1BH (Cortex®-M85) QSPI的功能介绍
  • 【路径跟踪控制:Pure Pursuit控制与车辆运动学模型】
  • Java | Leetcode Java题解之第516题最长回文子序列
  • 如何在 CMD 窗口中校验文件的 MD5 值
  • 如何在 Ubuntu 16.04 上使用 Let‘s Encrypt 保护 Nginx
  • 深度学习(六)CNN:图像处理的强大工具(6/10)
  • 【STM32-HAL库】TEMT6000光照强度传感器(STM32F407ZGT6)(附带工程下载链接)
  • 动态规划算法专题(九):完全背包问题
  • C语言 | Leetcode C语言题解之第515题在每个树行中找最大值
  • C++ | Leetcode C++题解之第516题最长回文子序列
  • #### 运用语言影切进行旧脑抑制:
  • 【STM32-HAL库】火焰传感器(STM32F407ZGT6)(附带工程下载链接)
  • 你了解kafka消息队列么?
  • Java基础04
  • 【音视频 | ADPCM】音频编码ADPCM详细介绍及例子
  • PCL库中的算法封装详解
  • springmvc请求源码流程解析(二)