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

【算法】栈与模拟

【ps】本篇有 5 道 leetcode OJ。

目录

一、算法简介

二、相关例题

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

.1- 题目解析

.2- 代码编写

2)比较含退格的字符串

.1- 题目解析

.2- 代码编写

3)基本计算器 II

.1- 题目解析

.2- 代码编写

4)字符串解码

.1- 题目解析

.2- 代码编写

5)验证栈序列

.1- 题目解析

.2- 代码编写


一、算法简介

        栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出的原则。它的插入操作叫做进栈(或进栈/入栈),插入的数据在栈顶;删除操作叫做出栈。出的数据也在栈顶。

        栈一般与模拟算法结合在一起出题,在题目中野经常充当数据的缓存容器,来帮助模拟入栈和出栈的过程以求得结果。

二、相关例题

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

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

.1- 题目解析

        我们用一个新字符串,对每个字符模拟入栈和出栈的过程即可,具体方式是遍历字符串,从左往右依此将字符入栈(尾插入新字符串),如果当前字符与栈顶的字符(新字符串的末尾字符)相同,就将栈顶的字符出栈(对新字符串尾删),且跳过当前字符,继续遍历下一个字符。

.2- 代码编写

class Solution {
public:string removeDuplicates(string s) {string ret;for(int i=0;i<s.size();i++){//用一个新字符串对每个字符模拟入栈和出栈的过程if(ret.size() && s[i]==ret.back())ret.pop_back();else ret+=s[i];}return ret;}
};

2)比较含退格的字符串

844. 比较含退格的字符串

.1- 题目解析

        类似的,这道题也可以用字符串来模拟入栈和出栈的过程,但与上道题不同的是,出栈的条件变成了若当前字符为 '#',入栈的条件为若当前字符不为 '#'。

.2- 代码编写

class Solution {
public:bool backspaceCompare(string s, string t) {return stackString(s)==stackString(t);}//用一个新字符串模拟入栈和出栈的过程string stackString(string& s){string st;for(auto ch:s){if(ch=='#'){if(st.size())st.pop_back();}else {st+=ch;}}return st;}
};

3)基本计算器 II

227. 基本计算器 II

.1- 题目解析

        这道题只有加减乘除四个运算,没有括号,并且每一个数都是大于等于 0 的, 这样可以大大地减少需要处理的情况。

        由于表达式里面没有括号,因此只用处理加减乘除混合运算即可,这样不需要用到双栈。根据四则运算的顺序,我们可以先计算乘除法,然后再计算加减法。由此可以得出下面的结论:

  • 当一个数前面是 ' + ' 号的时候,这⼀个数是否会被立即计算是不确定的,因此可以先入栈。
  • 当一个数前面是 ' - ' 号的时候,这⼀个数是否被立即计算也是不确定的,但是这个数已经和前面的负号绑定了,因此可以将这个数的相反数入栈。
  • 当一个数前面是 ' * ' 号的时候,这⼀个数可以立即与前面的⼀个数相乘,此时让将栈顶的元素乘上这个数;
  • 当一个数前面是 ' / ' 号的时候,这⼀个数也是可以立即被计算的,因此让栈顶元素除以这个数。

        当遍历完完整的表达式时,栈中剩余的元素之和就是最终结果。此外,这里可以用数组来模拟栈。

.2- 代码编写

class Solution {
public:int calculate(string s) {char op='+';//表达式开头没有运算符,但应默认是+号int i=0,n=s.size();vector<int> st;//用数组模拟栈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 x:st)ret+=x;return ret;}
};

4)字符串解码

394. 字符串解码

.1- 题目解析

        本题可以用两个栈来模拟解码的过程,其中一个栈存字符,另一个栈存数字。

        解码的顺序,是从括号内部向外部依此解码,如:3[ab2[cd]] -> 3[abcd cd] -> abcdcd abcdcd abcdcd 。

.2- 代码编写

class Solution {
public:string decodeString(string s) {stack<int> nums; //数字栈stack<string> st;//字符栈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]=='['){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 k=nums.top();nums.pop();while(k--){st.top()+=tmp;}i++;}//提取字符串,直接尾插到字符栈栈顶字符串的后面else{string tmp;while(i<n && s[i]>='a'&& s[i]<='z'){tmp+=s[i++];}st.top()+=tmp;}}return st.top();}
};

5)验证栈序列

946. 验证栈序列

.1- 题目解析

        这是一道经典的栈相关的题目,给定一个进栈序列,再给定一个出栈序列,要求根据进栈序列判断出栈序列是否合法。

        我们可以创建一个栈,然后分别遍历这两个序列,来模拟进栈和出栈的过程。遍历进栈序列的时候,先将序列中的元素依此 push 入栈,再遍历出栈序列中的元素,如果当前元素与刚入栈的这个元素相同,那么就将其出栈,如果不是,就继续对进栈序列中的元素进行入栈,直到遇到出栈序列中的相同元素再出栈。如此,遍历完两个序列后,如果栈为空,则说明栈序列是合法的。

.2- 代码编写

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

相关文章:

【算法】栈与模拟

【ps】本篇有 5 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;删除字符串中的所有相邻重复项 .1- 题目解析 .2- 代码编写 2&#xff09;比较含退格的字符串 .1- 题目解析 .2- 代码编写 3&#xff09;基本计算器 II .1- 题目解析 .2- 代码编写 4&…...

【Django】Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API

Django AI 聊天机器人项目&#xff1a;基于 ChatGPT 的 Django REST API 本文档将介绍如何使用 Django 和 Django REST Framework 构建一个 AI 聊天机器人项目&#xff0c;并结合 OpenAI 的 GPT 模型提供代码解释服务。步骤包括创建 Django 项目、配置 API、与 OpenAI 集成&am…...

System.out源码解读——err 和 out 一起用导致的顺序异常Bug

前言 笔者在写一个小 Demo 的过程中&#xff0c;发现了一个奇怪的问题。问题如下&#xff1a; // 当 flagtrue 时打印 a1 &#xff1b;当 flagfalse 时打印 a2。 public static void main(String[] args) {boolean flag false;for (int i 0; i < 10; i) {if (flag) {Sys…...

汽车软件开发之敏捷开发

一、前言 目前汽车电子产品&#xff0c;特别是汽车几大域控&#xff08;如&#xff1a;智能座舱、智能驾驶、智能网联、车身控制&#xff09;市场竞争激烈&#xff0c;消费者对汽车的需求逐渐多元化和个性化&#xff0c;用户对座舱和智驾产品的要求也越来越高。他们不仅要求产…...

ListBox显示最新数据、左移和右移操作

1、程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Sys…...

mysql实用系列:日期格式化

在MySQL中&#xff0c;你可以使用DATE_FORMAT()函数来格式化日期。DATE_FORMAT() 函数通常用于格式化 DATETIME 或 TIMESTAMP类型的字段。这个函数允许你按照指定的格式来显示日期和时间。下面是一些常见的日期格式化的例子&#xff1a; 显示年-月-日&#xff1a; SELECT DATE_…...

时钟频率、AI采样率与AO更新率的关系

在数据采集和信号生成设备&#xff08;如NI板卡&#xff09;中&#xff0c;时钟频率、AI&#xff08;模拟输入&#xff09;采样率、以及AO&#xff08;模拟输出&#xff09;更新率是三个至关重要的参数。它们共同决定了设备在信号采集与生成时的性能表现。本文将详细分析它们之…...

代理IP设置后IP不变?可能的原因及解决方法

在使用代理IP时&#xff0c;有时会遇到代理设置后IP地址却没有变化的情况。这种问题可能会让人感到困惑&#xff0c;但其实背后有多种原因。本文将详细探讨这些原因&#xff0c;并提供相应的解决方法&#xff0c;帮助你顺利解决问题。 可能的原因 代理IP设置后IP地址不变的原…...

瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商

本文适用于触觉智能所有Linux系统的开发板、主板添加自启动命令的方法&#xff0c;本次使用了触觉智能的EVB3588开发板演示&#xff0c;搭载了瑞芯微RK3588旗舰芯片。 该开发板为核心板加底板设计&#xff0c;为工业场景设计研发的模块化产品&#xff0c;10年以上稳定供货,帮助…...

Varjo在芬兰开设新工厂,以满足国防部门在XR模拟训练中的需求

在军事国防领域&#xff0c;全新技术的投入使用最看重的就是保密与安全。作为全球领先的XR头戴式显示器提供商Varjo&#xff0c;近日正式宣布将在位于芬兰的赫尔辛基开设一家新的安全制造工厂。 此次工厂扩建将使Varjo能够满足国防训练和模拟领域对其高分辨率XR解决方案日益增…...

python 识别省市、区县并组建三级信息数据库

一、网址&#xff1a; 全国行政区划信息查询平台 二、分析并搭建框架 检查网页源码&#xff1a; 检查网页源码可以发现&#xff1a; 所有省级信息全部在javaScript下的json中&#xff0c;会在页面加载时加载json数据&#xff0c;填充到页面的option中。 1、第一步&#xff1a…...

家用小型超声波清洗机怎么选?四大人气爆款品牌不可错过!

在现代社会快节奏的步伐中&#xff0c;保持高度的个人及家居卫生标准成为了日常生活的重要组成部分&#xff0c;对于追求高端生活品质的人群而言&#xff0c;这一点尤为重要。因此&#xff0c;选取一款集高效与便利于一体的超声波清洗机&#xff0c;无疑是升级日常清洁体验的理…...

NVIDIA最新AI论文介绍NEST:一种用于语音处理的快速高效自监督模型

语音处理专注于开发能够分析、解释和生成人类语音的系统。这些技术涵盖了多种应用&#xff0c;例如自动语音识别&#xff08;ASR&#xff09;、说话人验证、语音转文本翻译以及说话人分离。随着对虚拟助手、转录服务和多语言交流工具的依赖不断增加&#xff0c;高效准确的语音处…...

聊聊对别人表示真正的关注

在工作和生活中,那些重要人士所得到的关注已经很多了&#xff0c;所以你不能只关注那些重要的人&#xff0c;对那些保洁门卫、前台等也需要我们给予真心的关注。 他们可使你的生活正常有序&#xff0c;但却经常被你忽略&#xff0c;见面打个招呼时常跟他们聊一聊&#xff0c;这…...

大数据-133 - ClickHouse 基础概述 全面了解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

第1步win10宿主机与虚拟机通过NAT共享上网互通

VM的CentOS采用NAT共用宿主机网卡宿主机器无法连接到虚拟CentOS 要实现宿主机与虚拟机通信&#xff0c;原理就是给宿主机的网卡配置一个与虚拟机网关相同网段的IP地址&#xff0c;实现可以互通。 1、查看虚拟机的IP地址 2、编辑虚拟机的虚拟网络的NAT和DHCP的配置&#xff0c;…...

Python学习——【2.3】for循环

文章目录 【2.3】for循环一、for循环基础语法&#xff08;一&#xff09;基础语法※、练习 &#xff08;二&#xff09;range语句※、练习 &#xff08;三&#xff09;变量作用域 二、for循环嵌套使用※、练习 【2.3】for循环 一、for循环基础语法 &#xff08;一&#xff09…...

Element UI:初步探索 Vue.js 的高效 UI 框架

Element UI&#xff1a;初步探索 Vue.js 的高效 UI 框架 一 . ElementUI 基本使用1.1 Element 介绍1.2 Element 快速入门1.3 基础布局1.4 容器布局1.5 表单组件1.6 表格组件1.6.1 基础表格1.6.2 带斑马纹表格1.6.3 带边框表格1.6.4 带状态的表格 1.7 导航栏组件讲解 二 . 学生列…...

React Native防止重复点击

项目中遇到了点击按钮重复提交的问题&#xff0c;防止重复点击首先是想到的是给点击事件一个定时&#xff0c;下次触发的条件是要距离上一次点击的时间大于N秒的之后才能再执行。 // 防重复点击函数 export const preventRepeatPress {lastPressTi1me: 0, // 上次点击时间…...

如何将Git本地代码推送到Gitee云端仓库

如何将Git本地代码推送到Gitee云端仓库 在使用Git进行版本控制时&#xff0c;将本地代码推送到远程仓库是一个基本且重要的操作。本文将详细介绍如何将你的Git本地代码推送到Gitee&#xff08;码云&#xff09;云端仓库。Gitee是一个国内非常流行的代码托管平台&#xff0c;类…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...