C++ 栈OJ

目录

栈的应用场景:

1、 1047. 删除字符串中的所有相邻重复项

2、844. 比较含退格的字符串

3、 227. 基本计算器 II

4、394. 字符串解码

5、946. 验证栈序列


栈的应用场景:

  1. 表达式求值:栈常用于中缀表达式转换为后缀表达式,或者用于计算后缀表达式的值。栈可以帮助处理运算符的优先级和结合性。

  2. 括号匹配:栈可以用来检查表达式中的括号是否匹配。遍历表达式,遇到左括号时将其入栈,遇到右括号时与栈顶元素匹配,如果匹配则出栈,否则括号不匹配。

  3. 深度优先搜索(DFS):在树或图的深度优先搜索中,栈通常用于存储待访问的节点。每次访问一个节点时,将其邻居节点入栈,以便后续继续深度遍历。

  4. 逆波兰表达式:栈可以用于计算逆波兰表达式(后缀表达式)。遍历表达式,遇到操作数则入栈,遇到操作符则从栈中弹出操作数进行计算。

  5. 函数调用:在编程语言中,函数调用的实现通常使用栈。每次调用函数时,将函数参数、返回地址等信息压入栈中,函数返回时再从栈中弹出这些信息。

  6. 迷宫求解:栈可以用于迷宫求解算法中,记录走过的路径。在搜索迷宫的过程中,将当前位置入栈,如果遇到死路则回溯到上一个位置。

这些是栈在算法中常见的应用场景,栈的特性使其在处理递归、回溯、以及需要后进先出(LIFO)顺序的问题时非常有用。

1、 1047. 删除字符串中的所有相邻重复项

 思路:符合后进先出,⽤数组模拟栈。

class Solution {
public:string removeDuplicates(string s) {string ret;for (auto ch : s) {if (ret.size() && ret.back() == ch) {ret.pop_back();} else {ret += ch;}}return ret;}
};

2、844. 比较含退格的字符串

 思路:符合后进先出,⽤数组模拟栈。

class Solution {
public:bool backspaceCompare(string s, string t) { return judge(s) == judge(t); }string judge(string& s) {string ret;for (auto ch : s) {if (ch == '#') {if (ret.size())ret.pop_back();} else {ret += ch;}}return ret;}
};

3、 227. 基本计算器 II

 思路:分类讨论,模拟实现

  • 遇到操作符: 更新操作符char op
  • 遇到数字:
    • 先把数字提取出来, tmp;
    • 分情况讨论,根据 op 的符号
      • op == ‘+’ tmp 直接入栈:
      • op == ‘-’ tmp 入栈
      • op == ‘*’ 直接乘到栈顶元素上:
      • op == ‘/’ 直接除到栈顶元素上
class Solution {
public:int calculate(string s) {int n = s.size();vector<int> st;char op = '+';int i = 0;while (i < n) {if (s[i] == ' ')i++;else if (s[i] >= '0' && s[i] <= '9') {int tmp = 0;while (i < n && s[i] >= '0' && s[i] <= '9')tmp = tmp * 10 + (s[i++] - '0');if (op == '+')st.push_back(tmp);else if (op == '-')st.push_back(-tmp);else if (op == '*')st.back() *= tmp;elsest.back() /= tmp;} elseop = s[i++];}int sum = 0;for (auto n : st)sum += n;return sum;}
};

4、394. 字符串解码

 思路:这段代码是一个用于解码经过编码的字符串的函数。它使用了两个栈来处理解码过程,一个用于存储字符串,另一个用于存储重复次数。

在代码中,首先初始化了一个空字符串栈 st,并将一个空字符串压入栈中。然后初始化一个空的整数栈 nums。接着使用一个循环来遍历输入字符串 s

  • 如果当前字符是数字,则将连续的数字字符转换为一个整数,并将其压入整数栈 nums
  • 如果当前字符是左括号 [,则将空字符串压入字符串栈 st,并继续向后提取括号内的字符串。
  • 如果当前字符是右括号 ],则将栈顶字符串弹出,同时弹出对应的重复次数,然后将该字符串重复相应次数并添加到上一个字符串中。
  • 如果当前字符是字母,则将连续的字母字符添加到栈顶字符串中。

最终,函数返回栈顶的字符串,即解码后的结果。

class Solution {
public:string decodeString(string s) {stack<string> st;stack<int> nums;st.push("");int i = 0, n = s.size();while (i < n) {if (s[i] >= '0' && s[i] <= '9') {int tmp = 0;while (s[i] >= '0' && s[i] <= '9') {tmp = tmp * 10 + (s[i++] - '0');}nums.push(tmp);} else if (s[i] == '[') {string tmp = "";i++;// 把括号后⾯的字符串提取出来while (s[i] <= 'z' && s[i] >= 'a') {tmp += s[i++];}st.push(tmp);} else if (s[i] == ']') {string tmp = st.top();st.pop();int n = nums.top();nums.pop();while (n--) {st.top() += tmp;}i++;} else {while (i < n && s[i] >= 'a' && s[i] <= 'z') {st.top() += s[i++];}}}return st.top();}
};

5、946. 验证栈序列

 思路:⽤栈来模拟进出栈的流程。 ⼀直让元素进栈,进栈的同时判断是否需要出栈,同时记录出栈的元素个数。当所有元素模拟完毕之后,判断如果出栈元素个数等于popped数组,则验证成功,反之验证失败。

class Solution {
public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> st;int i=0,n=popped.size();for(auto x:pushed){st.push(x);while(st.size()&&st.top()==popped[i]){st.pop();i++;}} return i==n;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android14音频进阶:AudioTrack如何巧妙衔接AudioFlinger(五十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

Elemenu中el-table中使用el-popover选中关闭无效解决办法

主要是技术太菜,没找到原因,一点点才找到这个办法解决 因为在el-table-column里,因为是多行,使用trigger"manual" 时,用v-model"visible"来控制时,控件找不到这个值,才换成trigger"click" 先找到弹出关闭事件,再找元素的属性 右键>审核元素…

蓝桥杯python常用内置函数

一、 abs() #返回数字的绝对值 例&#xff1a; 二、 all() #判断给定的可迭代参数中的所有元素是否都为True&#xff0c;若是则返回True&#xff0c;反之返回False 例&#xff1a; 三、 any() #判断给定的可迭代参数是否都为False&#xff0c;全为False则返回False&am…

JDBC和连接池

JDBC和连接池 大纲 JDBC连接数据库的方式 具体案例 JDBC 需求&#xff1a;满足Java程序能对多个不同的数据库进行操作&#xff0c;而创建了一种接口&#xff0c;实现对数据库的规范 连接数据库的方式 1.方法1 先创建一个Driver对象&#xff0c;然后设置连接到的数据…

【unity实战】3D水系统,游泳,潜水,钓鱼功能实现

最终效果 文章目录 最终效果素材将项目升级为URP画一个水潭地形材质升级为URP创建水调节水第一人称人物移动控制游泳水面停留添加水下后处理水下呼吸钓鱼参考完结 素材 https://assetstore.unity.com/packages/vfx/shaders/urp-stylized-water-shader-proto-series-187485 将…

239.滑动窗口最大值

一个和 滑动窗口有关的题目 官方给出了三种解法 很值得借鉴 方法一: priority_queue O(nlogn) 使用模板库的优先队列保存pair(i, nums[i]) 在取最大值 .top() 的时候 注意 看一看它的下标在不在范围内(<i-k), 不在的时候需要把它(队首元素)pop出去 每次push或者pop…

Meta正打造一个巨型AI模型,旨在为其“整个视频生态系统”提供动力,一位高管透露

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Linux】gcc与make、makefile

文章目录 1 gcc/g1.1 预处理1.2 编译1.3 汇编1.4 链接1.4.1 静态链接1.4.2 动态链接 2 make和makefile2.1 依赖关系2.2 依赖方法2.3 伪目标 3 总结 1 gcc/g 当我们创建一个文件&#xff0c;并向里面写入代码&#xff0c;此时&#xff0c;我们该如何使我们的代码能够运行起来呢&…

java中使用rabbitmq

文章目录 前言一、引入和配置1.引入2.配置 二、使用1.队列2.发布/订阅2.1 fanout(广播)2.2 direct(Routing/路由)2.3 Topics(主题)2.4 Headers 总结 前言 mq常用于业务解耦、流量削峰和异步通信,rabbitmq是使用范围较广,比较稳定的一款开源产品,接下来我们使用springboot的sta…

保姆级认识AVL树【C++】(三种insert情况 || 四种旋转方法)

目录 前言 一&#xff0c;AVL概念 二&#xff0c;基础框架 三&#xff0c;insert 1. 插入三种情况 2. 四种旋转方法 法一&#xff1a;左单旋法 法二&#xff1a;右单旋法 法三&#xff1a;先左后右双旋法 法四&#xff1a;先右后左双旋法 测试&#xff08;判断一棵树…

修改简化docker命令

修改|简化docker命令 使用命令打开 .bashrc 文件&#xff1a; vim ~/.bashrc在文件中添加类似以下行来创建别名&#xff1a; # 查看所有容器 alias disdocker images # 查看运行容器 alias dpsdocker ps # 查看所有容器 alias dpsadocker ps -a # 停止容器 alias dsdocker s…

基于智慧灯杆的智慧城市解决方案(2)

功能规划 智慧照明功能 智慧路灯的基本功能仍然是道路照明, 因此对照明功能的智慧化提升是最基本的一项要求。 对道路照明管理进行智慧化提升, 实施智慧照明, 必然将成为智慧城市中道路照明发展的主要方向之一。 智慧照明是集计算机网络技术、 通信技术、 控制技术、 数据…