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

【C++】stack(一)

文章目录

  • 1.stack的介绍和使用
    • 1.1 stack的介绍
    • 1.2 stack的使用
      • 最小栈
      • 栈的弹出压入序列
      • 逆波兰表达式求值
      • 用两个栈实现队列

1.stack的介绍和使用

1.1 stack的介绍

stack的文档介绍

1.2 stack的使用

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

最小栈

1.插入值val<=minst栈顶数据,minst就要插入val。如果val=minst栈顶数据时却不插入,如果删除st栈顶数据,minst栈顶数据因为和st栈顶数据相等也会被删除

2.为什么可以没有MinStack(空 {})? 因为 MinStack 内部通常使用其他容器(如 std::stack 或
std::vector)来存储数据,而这些容器自身就有默认构造函数,能够正确初始化为空状态。 因此,MinStack
的构造函数不需要做任何额外工作,只需调用成员变量的默认构造即可。而成员变量的默认构造会被编译器自动调用,即使构造函数体为空。
实际上,如果你完全省略 MinStack() {}
这个显式定义,编译器也会隐式生成一个完全相同的默认构造函数。所以“可以没有”指的是:即使你不写这个函数,程序也能编译通过。

classMinStack{public:MinStack(){}voidpush(intval){_st.push(val);if(_minst.empty()||val<=_minst.top()){_minst.push(val);}}voidpop(){if(_st.top()==_minst.top())_minst.pop();_st.pop();}inttop(){return_st.top();}intgetMin(){return_minst.top();}private:stack<int>_st;stack<int>_minst;};

栈的弹出压入序列

思路:

  1. 入栈序列入栈
  2. 栈顶数据跟出栈序列比较
    2.1 相等,持续出栈顶数据,直到不相等或栈为空
    2.2 不相等
  3. 继续1,2,直到入栈序列进入完了
  4. 如果入栈序列进入完了,而出数据的栈为空则合法,否则不合法
class Solution{public:boolIsPopOrder(vector<int>&pushV,vector<int>&popV){size_tpushi=0,popi=0;stack<int>st;while(pushi<pushV.size()){st.push(pushV[pushi]);while(!st.empty()&&st.top()==popV[popi]){st.pop();popi++;}++pushi;}returnst.empty();}};

逆波兰表达式求值

逆波兰表达式也称后缀表达式,它的运算符优先级已经排好了
思路:
1.运算数入栈
2.遇到运算符,取栈顶两个数据运算,运算结果继续入栈,先取到的值是右操作数

注意

1.这里遍历string时,for(auto& e:str)中,auto要加&,如果不加 &,即 for (auto e :
str),则每个字符都会被拷贝到循环变量 e 中。虽然拷贝一个 char 开销很小,但对于长字符串或频繁遍历,累积的拷贝仍有一定成本。
使用 auto& 直接绑定到原字符串中的字符,无需拷贝,效率更高。

2.tokens 是 vector&,即字符串向量,它的每个元素是 string 类型(一个完整的 token,例如 “2”、“+”、“3”)。
因此,for(auto& str : tokens)中的 str 是 string 类型的引用,代表一个字符串,而不是单个字符。
后面使用 str[0] 是取这个字符串的第一个字符,用于 switch 判断运算符

3.在 C++ 中,switch 语句的 case 标签后面必须跟着整数常量表达式。但这里的 ‘+’、‘-’ 等字符字面量属于整数常量,因为字符类型 char 是整型的一种,每个字符都对应一个整数值(例如 ASCII 码)。所以 case ‘+’ 是合法的,编译器会将 ‘+’ 转换为它的 ASCII 码(43)进行比较。
换句话说,switch (str[0]) 拿到的是字符串的第一个字符(比如 ‘+’ 对应的整数 43),而 case ‘+’ 也是整数 43,两者匹配。这种写法很常见,比直接写数字 case 43 更直观。

classSolution{public:intevalRPN(vector<string>&tokens){stack<int>st;for(auto&str:tokens){if("+"==str||"-"==str||"*"==str||"/"==str){//运算符intright=st.top();st.pop();intleft=st.top();st.pop();switch(str[0]){case'+':st.push(left+right);break;case'-':st.push(left-right);break;case'*':st.push(left*right);break;case'/':// 题目说明了不存在除数为0的情况st.push(left/right);break;}}else{st.push(stoi(str));}}returnst.top();}};

用两个栈实现队列

classMyQueue{public:MyQueue(){}voidpush(intx){instack.push(x);}//返回删除元素intpop(){if(outstack.empty())in2out();intx=outstack.top();outstack.pop();returnx;}intpeek(){if(outstack.empty())in2out();returnoutstack.top();}//取队列的队首boolempty(){returninstack.empty()&&outstack.empty();}private:stack<int>instack;stack<int>outstack;voidin2out(){while(!instack.empty()){outstack.push(instack.top());instack.pop();}}};
http://www.jsqmd.com/news/674547/

相关文章:

  • 【Dify 2026微调实战白皮书】:首发业内唯一支持LoRA+QLoRA+Adapter三模协同的端到端微调框架
  • 基于YOLOv26深度学习算法的小区垃圾分类督导系统研究与实现
  • 别再被4K、8K忽悠了!聊聊电视行(TVLine)和水平清晰度,这才是画面清晰度的老底
  • PyQt5安装及学习
  • 【Linux】Socket编程TCP
  • 5分钟搞定电脑风扇噪音:Windows平台终极风扇控制软件FanControl完全指南
  • 7个高效配置技巧:解锁Ryujinx模拟器最佳游戏体验
  • RA6M5-EK502 开发板硬件原理简析
  • 从‘欠拟合’到‘过拟合’:手把手用AdaBoostRegressor可视化理解集成学习的拟合过程
  • 手把手教你用Matlab跑通OTFS仿真:从ISFFT到消息传递算法的保姆级代码解读
  • csdn_article
  • Coze对接飞书多维表格:内容数据每日自动同步系统开发指南
  • 【C++】queue(二)
  • Python 封神技巧:1 行代码搞定 90% 日常数据处理,效率直接拉满
  • SegNet 彻底吃透:编码器-解码器架构封神,语义分割边界精度卷到极致!
  • 医疗电爪安全规范详解,2026年优质医疗自动化电爪品牌甄选 - 品牌2026
  • LeetCode 热题 100-----4. 移动零
  • Anthropic新品频发“斩杀”传统软件公司,AI与SaaS是取代还是融合?
  • JVM执行模式解析:解释、编译与混合优化
  • 千问 LeetCode 1575.统计所有可行路径 public int countRoutes(int[] locations, int start, int finish, int fuel)
  • 嵌入式C语言高级编程之依赖注入模式
  • Cursor Skill 概念、编写与接入指南
  • 【C++】手撕日期类——运算符重载完全指南(含易错点+底层逻辑分析)
  • 《每个女孩都是生活家》
  • 如何利用智能照明控制器实现城市照明的“零扰民”运维?
  • ML:数据集、训练集与测试集
  • Ubuntu服务器Docker安装后必做的三件事:换源、装Portainer、设自启(避坑实录)
  • Meta烧Token成KPI,OpenClaw引发AI成本结构重塑:不拼算力拼效率
  • LeetCode热题100-单词拆分
  • 1.7k stars!Mozilla 出手了!开源 AI 客户端 Thunderbolt,让企业真正掌控自己的 AI!