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

算法———栈

目录

一、算法解析

二、题目

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

(1)题目

(2)解题思路

(3)代码实现

比较含退格的字符串

 (1)题目

(2)解题思路

(3)代码实现

基本计算机II

(1)题目

(2)解题思路

(3)代码实现

字符串解码

(1)题目 

(2)解题思路

(3)代码实现

​编辑

验证栈序列

(1)题目

(2)解题思路

(3)代码书写


一、算法解析

在一些题目中我们可以使用栈来化简题目

二、题目

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

https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/

(1)题目

(2)解题思路

我们可以用字符串模拟一个栈,如果下一个元素和栈顶元素相同,就pop,反之push

(3)代码实现

class Solution 
{
public:string removeDuplicates(string s) {string s1;for(auto e : s){if(s1.size()&&e == s1.back()) s1.pop_back();else s1.push_back(e);}return s1;}
};

比较含退格的字符串

https://leetcode.cn/problems/backspace-string-compare/

 (1)题目

(2)解题思路

这道题跟上一道题十分相似,我们可以使用一个字符串s1模拟栈,首先选择一个字符串s 遍历他,如果s1不是空串,且当前遍历s的字母是#就pop,其余的情况push当前遍历的s字母,t字符串重复上述操作,使用一个字符串s2,最后判断二者是否相同

(3)代码实现

class Solution{
public:bool backspaceCompare(string s, string t){string s1;string s2;for(auto e : s){if(e!='#')s1.push_back(e);else{if(s1.size()) s1.pop_back();}}for(auto e : t){if(e!='#')s2.push_back(e);else{if(s2.size()) s2.pop_back();}}return s1 == s2;}
};

基本计算机II

https://leetcode.cn/problems/basic-calculator-ii/

(1)题目

(2)解题思路

我们可以使用双栈来模拟计算机的过程

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

字符串解码

https://leetcode.cn/problems/decode-string/

(1)题目 

(2)解题思路

遍历字符串,建立两个栈

如果遇到数字提取提取数字入栈,如果遇到“【” 把后面的字符串提取出来,放入“字符串栈中”;

遇到‘】’ 解析,然后放到“字符串”栈顶的字符串后面,遇到单独的字符提取出来这个字符串,直接放在“字符串”

(3)代码实现

class Solution 
{
public:string decodeString(string s) {stack<int> nums;stack<string> st;st.push("");int n = s.size();int i = 0;while(i<n){if(s[i] >= '0'&& s[i] <= '9'){int tmp = 0;while(s[i] >= '0' && s[i] <= '9'){int x = s[i] - '0';tmp = tmp * 10 + x;i++;}nums.push(tmp);}else if(s[i] == '['){i++;string tmp;while(s[i] >= 'a' && s[i] <= 'z'){tmp+=s[i];i++;}st.push(tmp);}else if(s[i] == ']'){int k = nums.top();nums.pop();string s1 = st.top();st.pop();while(k--){st.top() += s1;}i++;}else{string tmp = "";while(i < n && s[i] >= 'a' && s[i] <= 'z'){tmp+=s[i];i++;}st.top() += tmp;}}return st.top();}
};

验证栈序列

https://leetcode.cn/problems/validate-stack-sequences/

(1)题目

(2)解题思路

我们可以模拟栈的过程,一直不停的入栈知道和pop相同在出栈,然后重复上述操             作

(3)代码书写

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

http://www.dtcms.com/a/540769.html

相关文章:

  • 甜点的网站建设规划书企业qq和个人qq有什么区别
  • java公式解析工具
  • 元推理:自指自洽,求道求德,美轮美奂
  • IE-Sec笔记7
  • 【Linux基础知识系列:第一百六十一篇】终端文件管理器:Midnight Commander (mc)
  • Google Veo 3.1 提示词生成器:让 AI 视频创作效率翻倍的免费工具
  • 【医学影像 AI】AutoMorph:基于深度学习的视网膜血管自动化分析工具
  • 郑州做网站找赢博科技定制app开发
  • 使用Docker安装Jenkins:完整指南与最佳实践
  • 手写一个C++字符串类:从底层理解String的实现
  • 大学学院教授委员会制度研究(四)职能设置--杨立恒毕业论文
  • Docker 命令自动补全:临时与持久化配置指南
  • 简单使用Nest+Nacos+Kafka实现微服务
  • 了解学习Redis主从复制
  • 【含文档+PPT+源码】基于java web的篮球馆管理系统系统的设计与实现
  • 眉山建设银行官方网站html5的网站设计与实现是做什么
  • 【音视频】图像与音频的3A技术:ISP相机与音频3A算法的对比
  • 字节码的“字节”含义
  • 做天然文化石的网站锦州网站建设多少钱
  • HarmonyOS实战项目:打造智能家居控制中心(设备发现与控制)
  • Linux存储软件栈剖析之第5篇:F2FS文件系统
  • iis7 网站权限设置chromeseo是什么
  • 新网站建设服务在线crm视频在线crm
  • MongoDB入门指南基础篇
  • 【洛谷】高精度专题 加减乘除全实现
  • 6.1.1.1 大数据方法论与实践指南-Spark/Flink 任务开发规范
  • _金仓数据库平替MongoDB实战:制造业生产进度管理的国产化升级之路
  • java-learn(8):拼图小游戏
  • 建设银行 福建分行招聘网站山西城乡建设厅网站首页
  • STM32学习(MCU控制)(SysTick and TIM)