♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥

♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥

♥♥♥我们一起努力成为更好的自己~♥♥♥

♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥

♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥

✨✨✨✨✨✨个人主页✨✨✨✨✨✨

        这一篇博客我们来探讨一下有关于栈的算法练习题,准备好了吗~我们发车去探索算法的奥秘啦~🚗🚗🚗🚗🚗🚗

目录

前言😁

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

比较含退格的字符串😜

基本计算器Ⅱ😀

字符串解码😍

验证栈序列😝


前言😁

        我们先来简单复习一下栈这个数据结构,栈(Stack)是一种后进先出的数据结构,我们可以想象一叠盘子:你通常会把新洗好的盘子放在最上面入栈),而当你需要用一个盘子时,你会从最上面拿走一个(出栈),你无法直接从中间或底部抽出一个盘子,栈的工作原理正是如此。

        话不多说,我们上题~

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

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

        看这题目有点眼熟,既然要删除重复字符,我们就得记录前面一个字符判断是否重复,这也就使用到我们强大的数据结构——栈。

算法思路栈模拟过程

①创建一个空栈

②遍历字符串,如果栈不为空并且栈顶元素与当前字符相等,那么栈顶元素出栈;否则,当前字符入栈

③栈中剩余字符出栈保存到字符串中

代码实现

//删除字符串中所有相邻重复项
class Solution
{
public:string removeDuplicates(string s){//使用数据结构容器——栈stack<char> st;//遍历字符串for (auto& e : s){//如果栈不为空并且栈顶元素与当前字符相等,那么栈顶元素出栈if (st.size() && e == st.top()){st.pop();}//否则,当前字符入栈(包括空栈的情况)else{st.push(e);}}string ret;//保存返回结果while (!st.empty()){ret += st.top();st.pop();}//逆序字符串就是正确结果reverse(ret.begin(), ret.end());return ret;}
};

顺利通过~不过这里的代码看起来还是有一些繁琐,我们有没有什么办法优化一下,主要在于栈中保存的仅仅是字符,需要进行提取才能得到我们的答案,那我们可以与字符串联系起来~

优化思路:因为要返回的是字符串,我们可以使用字符串来模拟栈工作的过程,字符串最后一个位置也就是我们的栈顶~

代码实现

class Solution
{
public:string removeDuplicates(string s){//字符串模拟栈string st;for (auto& e : s){if (st.size() && st.back() == e){st.pop_back();}else{st += e;}}return st;}
};

顺利通过~

比较含退格的字符串😜

比较含退格的字符串

        这一个题目与第一个题目类似,都是使用栈模拟这个过程,我们这里直接给出优化的算法思路~

算法思路字符串模拟栈实现过程

①根据题目要求,每一个字符串进行相同的变化(封装成一个函数changeS)

②changS函数内部使用字符串模拟栈,当栈不为空并且当前字符为‘#'时,栈顶元素出栈;否则,当前字符不为’#‘就入栈(如果对空文本输入退格字符,文本继续为空)

③判断两个字符串变化后是否相等

代码实现

//比较含退格的字符
class Solution
{
public:bool backspaceCompare(string s, string t){return changeS(s) == changeS(t);}string changeS(string s){string ret;for (auto& e : s){//当栈不为空并且当前字符为‘#'时,栈顶元素出栈if (ret.size() && e == '#'){ret.pop_back();}else if (e != '#')//小写字母入栈{ret.push_back(e);}}return ret;}
};

顺利通过~

基本计算器Ⅱ😀

基本计算器Ⅱ

        题目要求我们实现一个简单的计算器,我们这里给出一个巧妙的算法思路~

算法思路使用栈保存正数或者负数

栈存储中间结果:栈用于存储需要累加的值(正数或负数),乘除运算立即计算并更新栈顶

运算符延迟处理:遇到新运算符时只记录,遇到下一个数字时才应用上一个运算符

处理优先级:通过立即计算乘除运算实现"先乘除后加减"

空格直接跳过

栈中所有数据相加就是计算结果

运算符处理规则

前一个运算符当前数字处理方式
+st.push(val)
-st.push(-val)
*st.top() *= val
/st.top() /= val

代码实现

//基本计算器Ⅱ
class Solution
{
public:int calculate(string s){int n = s.size();char c = '+';//运算符号记录stack<int> st;//栈保存计算结果int i = 0;//记录下标while (i < n){//如果是空格,直接跳过!if (s[i] == ' ')i++;//如果是数字else if (s[i] >= '0' && s[i] <= '9'){//提取数字int val = 0;//保存数据while (s[i] >= '0' && s[i] <= '9'){val = val * 10 + (s[i] - '0');i++;}//判断数字前面的运算符if (c == '+'){st.push(val);}else if (c == '-'){st.push(-val);}else if (c == '*'){st.top() *= val;}else if (c == '/'){st.top() /= val;}}//如果是其他,也就是运算符,更新符号else{c = s[i++];}}//取栈中元素相加,得到运算结果int ret = 0;while (!st.empty()){ret += st.top();st.pop();}//返回结果return ret;}
};

顺利通过~这个题目也可以使用数组模拟栈实现功能,大家感兴趣可以自己试一试~

字符串解码😍

字符串解码

        我们需要根据要求进行字符串解码,好在给出的字符串是没有空格的,并且[ ]也是正确匹配的,我们可以进行分情况讨论处理。

算法思路分情况讨论

双栈结构:使用两个独立栈协同工作

st_int:存储数字(重复次数)

st_str:存储字符串片段,初始化时st_str压入空字符串""作为结果容器

四类字符处理逻辑

  • 数字(0-9):
    连续解析完整数字(如"12"→12),压入st_int

  • 左括号([):
    提取后续连续小写字母(如"[abc"→"abc"),作为新片段压入st_str

  • 小写字母(a-z):
    直接拼接到st_str栈顶字符串末尾

  • 右括号(]):
    弹出st_int栈顶数字nst_str栈顶字符串s,将s重复n次后拼接到新栈顶

嵌套解码机制

遇到[时压入新层级,遇到]时完成当前层级解码:

  • 内层字符串先解码(如3[c]→"ccc")

  • 结果拼接到外层字符串(如"ab"+"ccc"→"abccc")

  • 支持任意深度嵌套(如3[a2[c]]→"accaccacc")

结果生成

  • 最终返回st_str栈顶字符串:

    • 初始空字符串作为基础容器

    • 所有层级解码完成后栈顶即完整结果

    • 时间复杂度O(n),空间复杂度O(解码字符串长度)

代码实现

//字符串解码
class Solution
{
public:string decodeString(string s){stack<int> st_int;//保存数字stack<string> st_str;//保存字符串st_str.push("");//插入空字符串,分别后续变形int i = 0;while (i < s.size()){//分情况讨论//如果是数字,提取数字入数字栈if (s[i] >= '0' && s[i] <= '9'){int tmp = 0;while (s[i] >= '0' && s[i] <= '9'){tmp = 10 * tmp + (s[i] - '0');i++;}st_int.push(tmp);}//如果是[,提取后续字符保存到字符栈else if (s[i] == '['){i++;string tmp;while (s[i] >= 'a' && s[i] <= 'z'){tmp += s[i];i++;}st_str.push(tmp);}//如果是字符,那么加到字符栈栈顶字符串末尾else if (s[i] >= 'a' && s[i] <= 'z'){st_str.top() += s[i];i++;}//如果是],就取数字栈和字符栈栈顶,进行拼接else if (s[i] == ']'){string s = st_str.top();int n = st_int.top();st_int.pop();st_str.pop();for (int j = 0; j < n; j++){st_str.top() += s;//新字符栈拼接重复的字符}i++;}}return st_str.top();//字符栈顶就是需要的结果}
};

顺利通过~

验证栈序列😝

验证栈序列

      我们以前都做过类似的文字题,那么使用代码怎么解决呢?答案是进行模拟就可以了~

算法思路使用栈模拟

模拟核心逻辑:使用栈 st 实时模拟入栈/出栈操作,指针 i 跟踪 popped 序列当前位置,验证其合法性

入栈与即时匹配:遍历 pushed 序列:每个元素立即入栈,入栈后循环检查:当栈非空且栈顶元素等于 popped[i] 时→ 弹出栈顶元素→ i 指针后移(匹配成功)

代码实现

//验证栈序列
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.size() && st.top() == popped[i]){st.pop();i++;}}//通过判断栈是否为空或者i是否走到末尾判断是否为合法出栈序列return st.empty();//return i==popped.size();}
};

顺利通过~


♥♥♥本篇博客内容结束,期待与各位优秀程序员交流,有什么问题请私信♥♥♥

♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥

✨✨✨✨✨✨个人主页✨✨✨✨✨✨


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

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

相关文章

OpenAI 最新开源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署详细教程

OpenAI 最近发布了其首个开源的开放权重模型gpt-oss&#xff0c;这在AI圈引起了巨大的轰动。对于广大开发者和AI爱好者来说&#xff0c;这意味着我们终于可以在自己的机器上&#xff0c;完全本地化地运行和探索这款强大的模型了。 本教程将一步一步指导你如何在Windows系统上&…

在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖)

在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖) 在Linux系统中&#xff0c;有时候我们需要在特定的环境或架构下安装软件包&#xff0c;而不影响主系统。一种常见的方法是创建一个虚拟的根目录&#xff0c;并在此环境中操作。本文将介绍如何通过创建…

scratch笔记和练习-第9课:一起来绘画

位图也称为点阵图&#xff0c;它是由许许多多的点组成的&#xff0c;这些点被称为像素。位图图像可以表现丰富的多彩变化 并产生逼真的效果&#xff0c;很容易在不同软件之间交换使用&#xff0c; 但它在保存图像时需要记录每一个像素的色彩信息&#xff0c;所以占用的存储空间…

[linux] Linux:一条指令更新DDNS

Linux&#xff1a;一条指令更新DDNS 在动态IP环境下&#xff0c;如何确保我们的域名始终指向正确的公网IP地址&#xff1f;动态DNS&#xff08;DDNS&#xff09;服务为我们提供了完美的解决方案。今天&#xff0c;我将分享一个简洁高效的Linux命令行指令&#xff0c;用于自动更…

[激光原理与应用-182]:测量仪器 - 光束型 - 光束质量分析仪

光束质量分析仪是用于精确评估激光光束特性的核心设备&#xff0c;通过测量光束的强度分布、相位分布、发散角等参数&#xff0c;为激光系统的优化、加工工艺控制及科研实验提供关键数据支持。以下是光束质量分析仪的详细解析&#xff1a;一、核心功能 - 光束强度分布分析测量内…

Linux 限制 root 登录 IP 地址的方法

Linux 限制 root 登录 IP 地址的方法Linux 限制 root 登录 IP 地址的方法方法一&#xff1a;修改 SSH 配置文件方法二&#xff1a;使用 hosts.allow 和 hosts.deny 文件方法三&#xff1a;使用防火墙规则方法四&#xff1a;使用 access.conf 文件注意事项Linux 限制 root 登录 …

Word中怎样插入特殊符号

使用 “插入” 菜单&#xff1a;插入常用符号&#xff1a;将光标置于要插入符号的位置&#xff0c;点击 “插入” 选项卡&#xff0c;在 “符号” 组中点击 “符号” 按钮&#xff0c;会弹出一个符号库&#xff0c;里面包含了常见的标点符号、特殊字符等&#xff0c;找到所需符…

Linux 内核发包流程与路由控制实战

Linux 内核发包流程与路由控制实战 在网络调优、性能优化、SDN、NFV、容器网络等场景下&#xff0c;理解 Linux 内核发包路径和路由控制机制是必修课。 本文将从内核网络栈的原理入手&#xff0c;再结合 iproute2 命令和 策略路由给出实战案例。一、Linux 内核发包流程&#xf…

点播服务器

早期的时候&#xff0c;用 live555 作为 rtsp 点播服务器&#xff1b;现在比较常用的 流媒体服务器比较多&#xff1b;这里比较简单的&#xff0c;可以用 ZLMediakit&#xff1b;可以支持 ffmeg 退流 到ZLMediakit&#xff0c;然后别的客户端从 ZLMediakit 服务器拉流&#xff…

分享超图提供的、很不错的WebGIS学习资源

最近在学习了解Supermap iclient&#xff0c;发现官方提供的帮助文档、GIS学堂真的不错&#xff0c;解释了很多的内容。 官方modern-web-gis-in-action文档的网址如下&#xff1a;https://iclient.supermap.io/web/books/modern-web-gis-in-action/&#xff0c;在其中介绍了现代…

通信算法之298: verilog语法generate和for介绍

在 Verilog 中&#xff0c;generate和for是实现参数化设计和模块实例化复用的重要工具&#xff0c;尤其在需要根据参数动态生成逻辑时非常有用。以下是它们的使用方法和区别&#xff1a;1. for循环&#xff08;过程块内&#xff09;for循环主要用于过程块&#xff08;always/in…

laravel在cli模式下输出格式漂亮一些

在 Laravel 的 CLI 模式下&#xff0c;可以通过以下方式让命令行输出更加美观和专业&#xff1a; 1. 使用 Artisan 输出助手方法 Laravel 提供了多种输出样式方法&#xff1a; public function handle() {// 基础样式$this->info(成功信息 - 绿色); // 绿色$this->err…

大数据管理与应用学什么?就业前景怎么样?

前言在数字经济蓬勃发展的今天&#xff0c;大数据已经成为推动社会进步的核心生产要素。大数据管理与应用作为新兴交叉学科&#xff0c;正受到越来越多学生和企业的关注。本文将全面剖析该专业的课程体系、核心技能要求&#xff0c;详细介绍CDA数据分析师认证的备考策略&#x…

mac笔记本如何重新设置ssh key

要在Mac上重新生成SSH密钥并将其添加到平台&#xff0c;可以按照以下步骤操作&#xff1a; 打开终端 在Mac上&#xff0c;你可以通过Spotlight搜索&#xff08;按Command Space&#xff09;输入Terminal来打开终端或者直接搜索终端检查现有SSH密钥 首先&#xff0c;检查是否已…

Godot ------ 通过鼠标对节点进行操作

Godot ------ 通过鼠标对节点进行操作 引言 正文 引言 对于一个游戏,通过鼠标对游戏对象进行操作是非常普遍的行为,本文我们将以 Control 节点进行举例,说明如何通过鼠标对 Control 节点进行移动操作。 正文 首先,我们创建一个 Contorl 节点,并将它的 Layout->Trans…

k8s 网络插件 flannel calico

一、k8s 网络概述 Kubernetes网络是指在Kubernetes集群中不同组件之间进行通信和交互的网络架构&#xff0c;每个容器都有自己的IP地址&#xff0c;这些容器组成了Pod&#xff0c;Pod是Kubernetes调度的最小单元。 Pod是Kubernetes中最小的部署单元&#xff0c;每个Pod都有一个…

易美教育荣膺“腾讯年度影响力国际教育品牌”双奖加冕,见证中国国际教育力量的崛起

【腾讯新闻&#xff0c;北京讯】在刚刚圆满落幕的“回响中国”腾讯新闻教育频道年度论坛上&#xff0c;国际教育领域迎来了高光时刻&#xff1a;以美国华尔街为总部、深耕国际教育十余年的易美教育&#xff08;Easymay&#xff09;&#xff0c;凭借其持续创新的教育模式、国际化…

Chrome与Firefox浏览器安全运维配置命令大全:从攻防到优化的专业实践

Chrome与Firefox浏览器安全运维配置命令大全&#xff1a;从攻防到优化的专业实践 作者&#xff1a;高级网络安全工程师 吉林•镇赉融媒 刘晓伟 最后更新&#xff1a;2025年8月 适用对象&#xff1a;网络安全、运维从业者 浏览器作为访问互联网资源的主要入口&#xff0c;其配置…

用 “故事 + 价值观” 快速建立 IP 信任感

在知识变现、流量变现与粉丝变现的实践中&#xff0c;IP 的核心竞争力在于用户信任。“故事 价值观” 的组合&#xff0c;能快速缩短与用户的距离 —— 故事让 IP 从抽象符号变为可感知的存在&#xff0c;价值观则推动用户从被动关注转为主动认同&#xff0c;二者共同为变现筑…

PDF处理控件Aspose.PDF教程:使用 C#、Java 和 Python 代码调整 PDF 页面大小

使用 Aspose.PDF 调整 PDF 大小 Aspose.PDF 是一个功能强大且灵活的库&#xff0c;旨在跨多个平台&#xff08;包括 .NET、Java 和 Python&#xff09;处理 PDF 文件。在调整 PDF 大小方面&#xff0c;它提供了对页面尺寸和内容缩放的完全控制。无论您是想缩小 PDF 大小、将页…