栈(5题)

目录

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

 2.比较含退格的字符串

3.基本计算器2

4.字符串解码

5.验证栈序列


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

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

我们只需要用一个string的字符串模拟一下这个栈就可以了

如果ret为空则入栈,否则进行判断,如果遍历到的那个字母与栈顶字母相同,就把栈顶那个字母出栈,否则就继续入栈

class Solution {
public:
    string removeDuplicates(string s) {
        int n = s.size();
        string ret;
        for(int i = 0; i < n; i++)
        {
            if(ret.empty())
            {
                ret.push_back(s[i]);
            }
            else
            {
                if(s[i] == ret.back())
                {
                    ret.pop_back();
                }
                else
                {
                    ret.push_back(s[i]);
                }
            }
        }
        return ret;
    }
};

 2.比较含退格的字符串

844. 比较含退格的字符串 - 力扣(LeetCode)

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        string ret1;
        string ret2;
        int m = s.size();
        int n = t.size();
        for(int i = 0; i < m; i++)
        {
            if(s[i] == '#' && !ret1.empty())
            {
                ret1.pop_back();
            }
            else if(s[i] != '#')
            {
                ret1.push_back(s[i]);
            }
        }
        for(int i = 0; i < n; i++)
        {
            if(t[i] == '#' && !ret2.empty())
            {
                ret2.pop_back();
            }
            else if(t[i] != '#')
            {
                ret2.push_back(t[i]);
            }
        }
        if(ret1 == ret2)return true;
        else return false;
    }
};

3.基本计算器2

227. 基本计算器 II - 力扣(LeetCode)

        这题我们用一个数组模拟栈,再创建一个字符变量 op来 保存 + - * /。因为这道题比较简单,没有引入括号,因此算数符的优先级是确定的。 

        当我们遇到 + - 的符号的时候,我们先要把接下来的数字入栈,因为如果后面有 * /运算符,这个数就要和后面的数进行运算。当遇到* / 符号的时候,直接把这个数和栈顶的数进行运算。

        对于计算数,我们用一个while循环即可每次  把我们已经存下的数 * 10 再加上新的一位即可。

   值得注意的是,我们需要更改一下计算顺序tmp  = tmp * 10 + (s[i] - '0');先计算后面的,防止溢出,因为字符的阿斯克码值比较大

class Solution {
public:
    int calculate(string s) {
        vector<int> st;
        char op = '+';
        int n = s.size();
        for(int i = 0; i < n; )
        {
            if((s[i] > '9' || s[i] < '0'))
            {
                if(s[i] != ' ')
                {
                    op = s[i];
                }
                i++;
            }
            else
            {
                int tmp = 0;
                while(i < n && s[i] >= '0' && s[i] <= '9')
                {
                    tmp  = tmp * 10 + (s[i] - '0');
                    i++;
                }
                if(op == '+')
                {
                    st.push_back(tmp);
                }
                else if(op == '-')
                {
                    st.push_back(-tmp);
                }
                else if(op == '*')
                {
                    tmp = st.back() * tmp;
                    st.pop_back();
                    st.push_back(tmp);
                }
                else if(op == '/')
                {
                    tmp = st.back() / tmp;
                    st.pop_back();
                    st.push_back(tmp);
                }
            }
        }
        int ret = 0;
        for(int i = 0; i < st.size(); i++)
        {
            ret += st[i];
        }
        return ret;
    }
};

4.字符串解码

 394. 字符串解码 - 力扣(LeetCode)

这种括号改变运算优先级的题目一般都是用栈解决

我们先准备两个栈,一个存数字,一个存字符串

 这道题目需要我们分情况讨论:

1.如果遇到数字,提取出这个数字,放入数字栈

2.如果遇到‘[’:把后面的字符提取出来,放到字符串栈中

3.如果遇到‘]’:把数字栈栈顶的元素和字符串栈栈顶的元素分别出栈,并且拿出来进行运算,然后把运算出来的结果插入到新的字符串栈栈顶元素的后面(因为我们得出的运算结果可能是在另一对括号中的)

4.如果遇到单独的字符,一个一个放在字符串栈栈顶元素的后面,形成一个新的栈顶元素。

值得注意的点是,我们需要事先把字符串栈中加入一个空字符串,避免当栈里面只有一个元素的时候,把原栈顶元素加入新栈顶元素的时候栈为空。例如3[a]这种情况。

class Solution {
public:
    string decodeString(string s) {
        vector<int> ist;
        vector<string> sst;
        sst.push_back("");
        int n = s.size();
        for(int i = 0; i < n;)
        {
            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');
                    i++;
                }
                ist.push_back(tmp);
            }
            else if(s[i] == '[')
            {
                i++;
                string tmpstring1;
                while(i < n && s[i] >= 'a' && s[i] <= 'z')
                {
                    tmpstring1 += s[i];
                    i++;
                }
                sst.push_back(tmpstring1);
            }
            else if(s[i] ==']')
            {
                i++;
                string tmpstring2;
                for(int k = 0; k < ist.back(); k++)
                {
                    tmpstring2 += sst.back();
                }
                ist.pop_back();
                sst.pop_back();
                tmpstring2 = sst.back() + tmpstring2;
                sst.pop_back();
                sst.push_back(tmpstring2);
            }
            else
            {
                string tmpstring3;
                while( i < n && s[i] >= 'a' && s[i] <= 'z')
                {
                    tmpstring3 += s[i];
                    i++;
                }
                tmpstring3 = sst.back() + tmpstring3;
                sst.pop_back();
                sst.push_back(tmpstring3);
            }
        }
        return sst.back();
    }
};

5.验证栈序列

946. 验证栈序列 - 力扣(LeetCode)

这题我们让push里面的元素一直进栈,同时pop中的元素也一直进行出栈判断。 

等到循环结束判断其是否为空即可。

不过出栈之前要判断栈是否为空,如果为空就不要出栈。

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        int n = pushed.size();
        stack<int> st;
        int i = 0;
        int j = 0;
        while(i < n)
        {
            st.push(pushed[i]);
            while(st.size() && popped[j] == st.top())
            {
                st.pop();
                j++;
            }
            i++;
        }
        if(st.empty())return true;
        else return false;
    }
};

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为&#xff1a;Word.docx&#xff1a;考生文件夹样式的复制样式的修改 样式的应用&#xff08;没有相似/超级多的情况下&#xff09;——替换 [ ]通配符&#x…

麦芯 (MachCore) 应用开发教程 6:一台设备中多台电脑主从机的设置

麦芯是构建在windows系统上的设备应用操作系统&#xff0c;利用该系统可以快速高效的开发一款设备专用软件。希望进一步了解请email: acloud163.com 黄国强 2025/02/03 在麦芯&#xff08;MachCore&#xff09;应用开发过程中&#xff0c;多机协同工作的场景十分常见&#xf…

GRE阅读双线阅读 --青山学堂GRE全程班 包括 阅读、数学、写作、填空、背单词

新版GRE考试整体结构 section题量时间写作1篇issue30min语文S112道题(7道填空5道阅读)18min数学S112道题21min语文S215道题(7道填空8道阅读)23min数学S215道题26min Tips: 写作结束后&#xff0c;语文和数学的顺序不固定&#xff0c;2中可能&#xff1a; issue -> V ->…

014-STM32单片机实现矩阵薄膜键盘设计

1.功能说明 本设计主要是利用STM32驱动矩阵薄膜键盘&#xff0c;当按下按键后OLED显示屏上会对应显示当前的按键键值&#xff0c;可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。 2.硬件接线 模块管脚STM32单片机管脚矩阵键盘行1PA0矩阵键盘…

浅谈《图解HTTP》

感悟 滑至尾页的那一刻&#xff0c;内心突兀的涌来一阵畅快的感觉。如果说从前对互联网只是懵懵懂懂&#xff0c;但此刻却觉得她是如此清晰而可爱的呈现在哪里。 介绍中说&#xff0c;《图解HTTP》适合作为第一本网络协议书。确实&#xff0c;它就像一座桥梁&#xff0c;连接…

Android学习制作app(ESP8266-01S连接-简单制作)

一、理论 部分理论见arduino学习-CSDN博客和Android Studio安装配置_android studio gradle 配置-CSDN博客 以下直接上代码和效果视频&#xff0c;esp01S的收发硬件代码目前没有分享&#xff0c;但是可以通过另一个手机网络调试助手进行模拟。也可以直接根据我的代码进行改动…

使用mybatisPlus插件生成代码步骤及注意事项

使用mybatisPlus插件可以很方便的生成与数据库对应的PO对象&#xff0c;以及对应的controller、service、ImplService、mapper代码&#xff0c;生成这种代码的方式有很多&#xff0c;包括mybatis-plus提供的代码生成器&#xff0c;以及idea提供的代码生成器&#xff0c;无论哪一…

FFmpeg(7.1版本)在Ubuntu18.04上的编译

一、从官网上下载FFmpeg源码 官网地址:Download FFmpeg 点击Download Source Code 下载源码到本地电脑上 二、解压包 tar -xvf ffmpeg-7.1.tar.xz 三、配置configure 1.准备工作 安装编译支持的软件 ① sudo apt-get install nasm //常用的汇编器,用于编译某些需要汇编…

CMake的QML项目中使用资源文件

Qt6.5的QML项目中&#xff0c;我发现QML引用资源文件并不像QtWidgets项目那样直接。 在QtWidgets的项目中&#xff0c;我们一般是创建.qrc​资源文件&#xff0c;然后创建前缀/new/prefix​&#xff0c;再往该前缀中添加一个图片文件&#xff0c;比如&#xff1a;test.png​。…

微信登录模块封装

文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…

KNIME:开源 AI 数据科学

KNIME&#xff08;Konstanz Information Miner&#xff09;是一款开源且功能强大的数据科学平台&#xff0c;由德国康斯坦茨大学的软件工程师团队开发&#xff0c;自2004年推出以来&#xff0c;广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…

如何让DeepSeek恢复联网功能?解决(由于技术原因,联网搜索暂不可用)

DeekSeek提示&#xff1a;&#xff08;由于技术原因&#xff0c;联网搜索暂不可用&#xff09; 众所周知&#xff0c;因为海外黑客的ddos攻击、僵尸网络攻击&#xff0c;deepseek的联网功能一直处于宕机阶段&#xff0c;但是很多问题不联网出来的结果都还是2023年的&#xff0c…

【优先算法】专题——前缀和

目录 一、【模版】前缀和 参考代码&#xff1a; 二、【模版】 二维前缀和 参考代码&#xff1a; 三、寻找数组的中心下标 参考代码&#xff1a; 四、除自身以外数组的乘积 参考代码&#xff1a; 五、和为K的子数组 参考代码&#xff1a; 六、和可被K整除的子数组 参…

刷题记录 动态规划-6: 62. 不同路径

题目&#xff1a;62. 不同路径 难度&#xff1a;中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#x…

梯度、梯度下降、最小二乘法

在求解机器学习算法的模型参数&#xff0c;即无约束优化问题时&#xff0c;梯度下降是最常采用的方法之一&#xff0c;另一种常用的方法是最小二乘法。 1. 梯度和梯度下降 在微积分里面&#xff0c;对多元函数的参数求∂偏导数&#xff0c;把求得的各个参数的偏导数以向量的形式…

基于STM32的智能安防监控系统

1. 引言 随着物联网技术的普及&#xff0c;智能安防系统在家庭与工业场景中的应用日益广泛。本文设计了一款基于STM32的智能安防监控系统&#xff0c;集成人体感应、环境异常检测、图像识别与云端联动功能&#xff0c;支持实时报警、远程监控与数据回溯。该系统采用边缘计算与…

优化代码性能:利用CPU缓存原理

在计算机的世界里&#xff0c;有一场如同龟兔赛跑般的速度较量&#xff0c;主角便是 CPU 和内存 。龟兔赛跑的故事大家都耳熟能详&#xff0c;兔子速度飞快&#xff0c;乌龟则慢吞吞的。在计算机中&#xff0c;CPU 就如同那敏捷的兔子&#xff0c;拥有超高的运算速度&#xff0…

Notepad++消除生成bak文件

设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示

如何创建折叠式Title

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了SliverGrid组件相关的内容&#xff0c;本章回中将介绍SliverAppBar组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的SliverAppBar和普通的AppBar类似&#xff0c;它们的…

K个不同子数组的数目--滑动窗口--字节--亚马逊

Stay hungry, stay foolish 题目描述 给定一个正整数数组 nums和一个整数 k&#xff0c;返回 nums 中 「好子数组」 的数目。 如果 nums 的某个子数组中不同整数的个数恰好为 k&#xff0c;则称 nums 的这个连续、不一定不同的子数组为 「好子数组 」。 例如&#xff0c;[1,2,…