【LeetCode热题100】栈

devtools/2024/11/24 3:39:34/

这道题一共记录了关于栈的5道题目:删除字符串中所有相邻重复项、比较含退格的字符串、基本计算器II、字符串解码、验证栈序列。

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

题目分析:这道题我们使用数组模拟栈,遍历字符串,把字符依次放到栈里,如果这个字符和栈顶字符一样,那么就出栈,否则入栈。

class Solution {
public:bool backspaceCompare(string s, string t) {return ChangeStr(s) == ChangeStr(t);   }string ChangeStr(string s){string ret; //用数组模拟栈结构for(auto c : s){if(c != '#') ret += c;else if(ret.size() > 0) ret.pop_back();}return ret;}
};

题目分析:这道题也是用数组模拟栈,依次将两个字符串调整,比较调整完的字符串是否相等即可。

class Solution {
public:int calculate(string s) {char op = '+';vector<int> st;int i = 0, n = s.size();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;else if(op == '/') st.back() /= tmp;}else{op = s[i++];}}int ret = 0;for(auto e : st){ret += e;}return ret;}
};

题目分析:这道题我们使用栈来模拟计算过程,在遍历字符串的写一个字符时,需要分情况讨论:

  • 遇到操作符,更新操作符op
  • 遇到数字:

              1)先把数字提取出来,记为tmp

              2)根据op的不同,分情况讨论:

                        op == “+” ,tmp直接入栈

                        op == “-”,-tmp入栈

                        op == “*”,直接乘到栈顶元素上

                        op == “/”,直接除到栈顶元素上

class Solution {
public:string decodeString(string s) {stack<string> st;st.push("");stack<int> num;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';}num.push(tmp);}else if(s[i] == '['){i++;string tmp;while(s[i] >= 'a' && s[i] <= 'z'){tmp += s[i++];}st.push(tmp);}else if(s[i] == ']'){string tmp = st.top();st.pop();int n = num.top();num.pop();while(n--){st.top() += tmp;}i++;}else{while(i < n && s[i] >= 'a' && s[i] <= 'z'){st.top() += s[i++];}}}return st.top();}
};

题目分析:这道题需要借助建立两个栈来解决,其中一个栈用来存放次数,一个栈用来存放字符串,依次遍历这个字符串,分情况讨论:

1)遇到数字:提取出来这个数,放入“数字栈”。

2)遇到‘[’:把后面的字符串提取出来,放入“字符串栈”中。

3)遇到‘]’:解析,然后放到“字符串栈”栈顶的字符串后面。这里有一个细节需要注意,为了保证操作的一致性,需要在最开始把字符串栈初始化为""

4)遇到单独的字符:提取出来这个字符串,直接放在“字符串栈”栈顶的字符串后面。

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

题目分析:这道题需要借助栈来解决。

1)让元素一直进栈。

2)进栈后,判断是否出栈即可。

所有元素进栈完毕后,判断栈是否为空。


http://www.ppmy.cn/devtools/136442.html

相关文章

easyExcel - 导出合并单元格

目录 前言一、情景介绍二、问题分析三、代码实现四、测试代码 前言 Java-easyExcel入门教程&#xff1a;https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如何使用 easyExcel&#xff0c;以及写了两个入门的 demo &#xff0c;这两个 demo 能应付在开发…

数据结构-7.Java. 对象的比较

本篇博客给大家带来的是java对象的比较的知识点, 其中包括 用户自定义类型比较, PriorityQueue的比较方式, 三种比较方法...... 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 .…

IntelliJ IDEA常用快捷键

文章目录 环境快捷键外观编辑移动光标提示查找Live Templates列操作调试运行 环境 Ubuntu 24.04.1IntelliJ IDEA 2024.1.6 快捷键 外观 Alt 1&#xff1a;打开/关闭“项目”窗口&#xff08;即左边的导航窗口&#xff09; Alt 4&#xff1a;打开/关闭“运行”窗口 Alt …

湘潭大学软件工程算法设计与分析考试复习笔记(二)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09; 前言 现在接着昨天的复习。今天复习一下&#xff0c;把人机交互的实验二综述写一下&#xff0c;把实验三的 bug 改一下。 模拟退火 最后热情被消耗殆尽&#xff0c;是这意思吗哈哈。这个模拟退…

sourceTree无效的源路径问题解决

1.点击工具 2.点击选项 3.修改ssh客户端为OpenSSH 4.点击确定&#xff0c;然后重新打开软件

从源头保障电力安全:输电线路动态增容与温度监测技术详解

在电力系统中&#xff0c;输电线路是电能传输的关键环节。然而&#xff0c;当导线温度过高时&#xff0c;会加速导线老化&#xff0c;降低绝缘性能&#xff0c;甚至引发短路、火灾等严重事故&#xff0c;对电网安全运行构成巨大威胁。近日&#xff0c;某地区因持续高温和用电负…

数据库课程设计全流程:方法与实例解析

--- ### 一、数据库课程设计概述 数据库课程设计是学习数据库理论知识的重要实践环节&#xff0c;旨在帮助学生掌握数据库设计和应用系统开发的完整流程&#xff0c;包括需求分析、数据库设计、功能实现以及性能优化。 #### **设计目标** 1. 掌握数据库设计的基本步骤和原则…

SpringBoot中小企业人事管理系统:设计模式

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中小企业人事管理系统当然也不能排除在外。中小企业人事管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和…