【LeetCode】栈精选9题

目录

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

2. 逆波兰表达式(中等)

3. 基本计算器 II(中等)

4. 字符串解码(中等)

5. 验证栈序列(中等)

6. 小行星碰撞(中等)

单调栈:

1. 每日温度(中等)

2. 柱状图中最大的矩形(困难)

3. 最大矩形(困难)


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

class Solution {
public:string removeDuplicates(string s) {string ans; // 字符串模拟栈,这样可以直接输出答案,不用把栈转成字符串for (auto& ch : s){if (!ans.empty() && ch == ans.back()){ans.pop_back(); // 出栈}else{ans += ch; // 入栈}}return ans;}
};

2. 逆波兰表达式(中等)

遍历字符串数组,

  • 如果遇到操作数,将操作数入栈
  • 如果遇到运算符,将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,然后计算,然后将计算结果入栈

遍历完字符串数组后,栈中只有一个元素就是逆波兰表达式的值。

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;for (auto& s : tokens){if (s == "+" || s == "-" || s == "*" || s == "/"){int right = st.top();st.pop();int left = st.top();st.pop();st.push(calculate(left, right, s[0]));}else{st.push(stoi(s));}}return st.top();
}private:int calculate(int left, int right, char op){switch (op){case '+':return left + right;case '-':return left - right;case '*':return left * right;case '/':return left / right;default:return 0;}}
};

3. 基本计算器 II(中等)

先计算乘除,后计算加减:

  • 当一个数前面是 + 时,该数入栈
  • 当一个数前面是 - 时,该数的相反数入栈
  • 当一个数前面是 * / 时,将该数与栈顶元素进行计算,并将栈顶元素替换为计算结果

遍历完字符串后,栈中所有元素的和就是表达式的值。

class Solution {
public:int calculate(string s) {vector<int> st; // 数组模拟栈,方便最后计算栈中所有元素的和int n = s.size();int i = 0;char op = '+';while (i < n){if (s[i] == ' '){i++;}else if (s[i] >= '0' && s[i] <= '9'){// 将数字提取出来int num = 0;while (i < n && s[i] >= '0' && s[i] <= '9'){num = num * 10 + (s[i++] - '0');}if (op == '+'){st.push_back(num);}else if (op == '-'){st.push_back(-num);}else if (op == '*'){st.back() *= num;}else{st.back() /= num;}}else{op = s[i];i++;}}// 计算栈中所有元素的和int ans = 0;for (auto& e : st){ans += e;}return ans;}
};

4. 字符串解码(中等)

class Solution {
public:string decodeString(string s) {stack<int> nums; // 数字栈stack<string> strs; // 字符串栈strs.push("");int n = s.size();int i = 0;while (i < n){if (s[i] >= '0' && s[i] <= '9'){// 将数字提取出来int num = 0;while (i < n && s[i] >= '0' && s[i] <= '9'){num = num * 10 + (s[i++] - '0');}// 将数字压入数字栈nums.push(num);}else if (s[i] == '['){// 将[后面的字符串提取出来i++;string str;while (i < n && s[i] >= 'a' && s[i] <= 'z'){str += s[i++];}// 将字符串压入字符串栈strs.push(str);}else if (s[i] == ']'){// 遇到']'时,数字栈栈顶k和字符串栈栈顶s是对应的,即s重复了k次// 将数字栈栈顶和字符串栈栈顶都出栈// 将s重复了k次后的字符串追加到现在的字符串栈栈顶int k = nums.top();nums.pop();string str = strs.top();strs.pop();while (k--){strs.top() += str;}i++;}else{// 将单独的字符串(不是'['后面的字符串)提取出来string str;while (i < n && s[i] >= 'a' && s[i] <= 'z'){str += s[i++];}// 将字符串追加到字符串栈栈顶strs.top() += str;}}return strs.top();}
};

5. 验证栈序列(中等)

遍历数组pushed,将pushed的每个元素依次入栈,每次将pushed的元素入栈之后,如果栈不为空且栈顶元素与popped的当前元素相同,则将栈顶元素出栈,同时遍历数组popped,直到栈为空或栈顶元素与popped的当前元素不同。

遍历数组pushed结束之后,每个元素都按照数组pushed的顺序入栈一次。如果栈为空,则每个元素都按照数组popped的顺序出栈,返回true。如果栈不为空,则元素不能按照数组popped的顺序出栈,返回false。

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

6. 小行星碰撞(中等)

使用栈模拟小行星碰撞。

遍历小行星数组asteroids,当遍历到小行星e时,使用变量alive记录小行星e是否还存在(即未爆炸)。

当小行星e存在且e < 0,栈非空且栈顶元素> 0时,说明两个小行星相互向对方移动:

  1. 先看e是否存在:栈顶元素 < -e,e存在;栈顶元素 >= -e,e爆炸。
  2. 再看栈顶元素是否存在:如果栈顶元素<= -e,则栈顶元素爆炸,执行出栈操作。

重复以上判断直到不满足条件,如果最后alive为真,说明小行星e不会爆炸,则将e入栈。

class Solution {
public:vector<int> asteroidCollision(vector<int>& asteroids) {        vector<int> st; // 数组模拟栈,这样可以直接输出答案,不用把栈转成数组for (auto e : asteroids){bool alive = true;while (alive && e < 0 && !st.empty() && st.back() > 0){alive = st.back() < -e; // e 是否存在if (st.back() <= -e){   st.pop_back();}}if (alive){st.push_back(e);}}return st;}
};

单调栈:

1. 每日温度(中等)

可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。

遍历温度数组,如果栈不空且当前温度> 栈顶对应的温度,那么就能知道栈顶那一天下一个更高温度出现在几天后,将栈顶出栈,循环操作,直到不满足“栈不空且当前温度> 栈顶对应的温度”的条件,此时将当前下标入栈。

遍历完温度数组后,留在栈中的下标就是气温在这之后都不会升高,不用手动把其在答案数组对应的数置为0,因为最开始数组默认用0初始化。

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st; // 单调栈int n = temperatures.size();vector<int> ans(n);for (int i = 0; i < n; i++){while (!st.empty() && temperatures[i] > temperatures[st.top()]){int index = st.top();ans[index] = i - index;st.pop();}st.push(i);}return ans;}
};

2. 柱状图中最大的矩形(困难)

以某根柱子为顶的最大矩形,一定是从该柱子向两侧延伸直到遇到比它矮的柱子。

创建一个递增栈,遍历高度数组,如果当前高度> 栈顶元素,入栈;否则,栈顶出栈,并计算以栈顶的柱子为顶的最大矩形面积。由于保存在栈中的柱子的高度是递增排序的,因此栈中位于栈顶前面的一根柱子一定比位于栈顶的柱子矮,于是很容易就能找到位于栈顶的柱子两侧比它矮的柱子。

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int n = heights.size();stack<int> st; // 递增栈st.push(-1);int ans = 0;for (int i = 0; i < n; ++i){while (st.top() != -1 && heights[st.top()] >= heights[i]){int height = heights[st.top()];st.pop();int width = i - st.top() - 1;ans = max(ans, height * width);}st.push(i);}while (st.top() != -1){int height = heights[st.top()];st.pop();int width = n - st.top() - 1;ans = max(ans, height * width);}return ans;}
};

3. 最大矩形(困难)

将矩阵中上下相邻的值为1的格子看成柱状图中的柱子。假设矩阵有m行n列,以矩阵的每行为基线,就可以得到m个柱状图,然后就可以计算并比较每个柱状图中的最大矩形。

class Solution {
public:int maximalRectangle(vector<vector<char>>& matrix) {int m = matrix.size();    // 行int n = matrix[0].size(); // 列vector<int> heights(n, 0);int ans = 0;for (int i = 0; i < m; ++i){for (int j = 0; j < n; ++j){if (matrix[i][j] == '0'){heights[j] = 0;}else{heights[j]++;}}ans = max(ans, largestRectangleArea(heights));}return ans;}private:int largestRectangleArea(vector<int>& heights) {int n = heights.size();stack<int> st; // 递增栈st.push(-1);int ans = 0;for (int i = 0; i < n; ++i){while (st.top() != -1 && heights[st.top()] >= heights[i]){int height = heights[st.top()];st.pop();int width = i - st.top() - 1;ans = max(ans, height * width);}st.push(i);}while (st.top() != -1){int height = heights[st.top()];st.pop();int width = n - st.top() - 1;ans = max(ans, height * width);}return ans;}
};

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

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

相关文章

新能源汽车智慧充电桩方案:基于视频监控的可视化智能监管平台

一、方案概述 TSINGSEE青犀&触角云新能源汽车智慧充电桩方案围绕互联网、物联网、车联网、人工智能、视频技术、大数据、4G/5G等技术&#xff0c;结合云计算、移动支付等&#xff0c;实现充电停车一体化、充电桩与站点管理等功能&#xff0c;达到充电设备与站点的有效监控…

有效防范网络风险的关键措施

在数字化时代&#xff0c;企业面临着日益复杂和频繁的网络风险。提高员工的网络安全意识是防范网络威胁的关键一步。本文将探讨企业在提升网络安全意识方面可以采取的措施&#xff0c;以有效预防潜在的网络风险。 1. 开展网络安全培训&#xff1a;企业应定期组织网络安全培训&…

vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持

文章目录 一、v-model是什么二、什么是语法糖三、v-model常见的用法1、对于输入框&#xff08;input&#xff09;&#xff1a;2、对于复选框&#xff08;checkbox&#xff09;&#xff1a;3、对于选择框&#xff08;select&#xff09;&#xff1a;4、对于组件&#xff08;comp…

java基本算法

1.链表 链表用来存储数据&#xff0c;由一系列的结点组成。这些结点的物理地址不一定是连续的&#xff0c;即可能连续&#xff0c;也可能不连续&#xff0c;但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表内的数据类型可以是多种多样的。数组也是…

中霖教育:2024年一建、二建考试问题整理

报名、考试时间&#xff1a; ①一建&#xff1a;报名时间6月;考试时间9月上旬 ②二建&#xff1a;报名时间1-3月份;考试时间6月 考试科目&#xff1a; ①一级建造师考试科目一共有四门,依次是《建设工程经济》、《建设工程法规及相关知识》、《建设工程项目管理》、《专业工…

Vue以弹窗形式实现导入功能

目录 前言正文 前言 由于个人工作原因&#xff0c;偏全栈&#xff0c;对于前端的总结还有些初出茅庐&#xff0c;后续会进行规整化的总结 对应的前端框架由&#xff1a;【vue】avue-crud表单属性配置&#xff08;表格以及列&#xff09; 最终实现的表单样式如下&#xff1a;…

深入浅出AI落地应用分析:国内Top10应用

接下来会每周集中体验一些通用或者垂直的AI落地应用&#xff0c;主要以一些全球或者国外国内排行较前的产品为研究对象&#xff0c;「AI 产品榜&#xff1a; aicpb.com」以专题的方式在博客进行分享。 1. 文心一言 产品链接&#xff1a;https://yiyan.baidu.com/ 产品介绍&…

UE5 C++ 学习笔记 UBT UHT 和 一些头文件

总结一些似懂非懂的知识点&#xff0c;从头慢慢梳理。 任何一个项目都有创建这些三个.cs。 这个是蓝图转C 这个是本身就是C项目,应该就是多了一个GameModeBase类 Build.cs包含了每个模块的信息&#xff0c;表明了这个项目用到了哪一些模块。该文件里的using UnrealBuilTool 是…

c JPEG 1D DCT

步骤&#xff1a; 1. 对yuv 88 数据 8行分别1D DCT 2, 用8行 1D DCT 得到的数据生成中间88 块 Zj 3,对Zj 的8列再 1D DCT 后生成8列,用这8列组合成8*8的2D DCT 系数 准备用此1D DCT程序代替以前写的2D DCT,看能减少多少编码时间。 看网上文章&#xff0c;ffmpeg用…

什么是车载信息娱乐系统和集成驾驶舱

什么是车载信息娱乐系统(IVI)? “车载信息娱乐(IVI)”通过向驾驶员和乘客提供信息和娱乐&#xff0c;为驾驶提供便利和舒适。为了理解这个概念&#xff0c;有必要知道“信息娱乐”的含义。“信息娱乐”是这个市场中使用的一个词&#xff0c;它结合了“信息”和“娱乐”两个词…

5.文本文件编辑命令

1.cat 用于查看纯文本文件&#xff08;内容较少的&#xff09; 加上-n参数&#xff0c;显示内容加行号 [rootlocalhost ~]# cat -n /etc/sysconfig/network-scripts/ifcfg-ens160 2.more 用于查看纯文本文件&#xff08;内容较多的&#xff09; 还可以使用空格键或回车 键…

使用pyechart创建折线图

import json from pyecharts.charts import Line from pyecharts import options# 首先使用文件打开数据 f_us open(Desktop/python/Project/数据可视化/美国.txt,r,encoding"UTF-8") f_rb open(Desktop/python/Project/数据可视化/日本.txt,r,encoding"UTF-8…

Springboot+vue项目部署所有遇到的坑

https://flowus.cn/siriusx/share/0a818075-372b-4948-88af-c75c1d10ceab项目地址及笔记 Spring Boot3VUE3前后端分离项目基于Jwt的校验方案 环境搭建 安装jdk17 安装mysql server https://ubuntu.com/server/docs/databases-mysql 将服务器root账号由系统验证改为密码验证…

SSL证书中RSA算法跟ECC算法的区别

RSA算法和ECC算法指的是SSL证书的加密算法&#xff0c;详细解释如下&#xff1a; RSA算法&#xff1a;国际标准算法&#xff0c;应用较早的算法之一&#xff0c;普遍性更强&#xff0c;同比ECC算法的适用范围更广&#xff0c;兼容性更好&#xff0c;一般采用2048位的加密长度&…

[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05-5+6

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05-56 5. An Example 2D例子6. Extended Kalman Filter扩展卡尔曼滤波器&#xff08;EKF&#xff09; 5. An Example 2D例子 6. Extended Kalman Filter扩展卡尔曼…

【centos 安装配置nginx】nginx负载均衡、限流配置

本篇博客将详细介绍如何在centos上安装并配置nginx&#xff0c;步骤详细&#xff0c;希望能帮助到刚接触nginx的伙伴。 一、安装插件 1.安装gcc插件 因为nginx是用c语言编写的&#xff0c;所有要安装gcc。先检查是否已经安装过了。 提示&#xff1a;一般租的服务区里面是都有…

v3的响应式,ref,reactive和生命周期(简写)

vue3笔记 1.两种安装方式 (1)直接创建项目vue3 (2)使用vite 组件传值 1.组件传值的用法 从父组件向子组件传值&#xff1a; <Son :prop1"nmb"></Son> 2.defineprops函数 defineProps函数在setup标签内不需要引入&#xff0c;可直接使用 defineP…

web学习笔记(十六)

目录 HTML5新增标记汇总 1.新增语义化标签 2.新增音频和视频标签 2.1音频标签 audio 2.1视频标签 video 3.新增图像标签 4.新增表单元素和表单控件 HTML5新增标记汇总 1.新增语义化标签 新增语义化标签能够便于开发者阅读和写出更优雅的代码同时让浏览器或是网络爬虫可…

STM32-调用 vTaskStartScheduler API 后出现 HardFault

STM32 移植 FreeRTOS 后调用 vTaskStartScheduler() 后出现 HardFault 异常。 原因分析&#xff1a; FreeRTOS 配置头文件 FreeRTOSConfig.h 中与中断有关的配置和通过系统接口 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 设置的中断分组冲突。 /* The lo…