【day2】数据结构刷题 栈

一  有效的括号

给定一个只包括 (){}[] 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = ( )

输出:true

示例 2:

输入:s = ( ) [ ] { }

输出:true

示例 3:

输入:s = ( ]

输出:false

示例 4:

输入:s = ( [ ] ) 

输出:true

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

解题思路
1  首先要排除两种特殊的情况就是当这个括号为空或者首个括号就是闭括号的两个情况
2  这里是需要用到栈的思想,我的解答是没有用到STL库里面的给的栈,而是用了string类型
3  当我遇到左括号的时候,我就用string的运算法则,把这个左括号放到最后面,当遇到右括号的时候,就进行匹配是不是右括号的左括号,如果不是就直接返回false
4  最后我们还要检查是不是所有的括号都进行了匹配,才可以返回true,否则就是返回false


代码

class Solution {
public:bool isValid(string s) {if (s.empty()) return true;if (s[0] == ']' || s[0] == ')' || s[0] == '}') return false; int num1 = 0;string str = "";for (int i = 0; i < s.length(); i++) { if (s[i] == '(' || s[i] == '{' || s[i] == '[') {str.push_back(s[i]);num1++;} else {if (num1 == 0) return false; // 如果没有开括号可匹配,返回 falsechar index = str.back(); str.pop_back(); num1--;// 判断是否匹配if ((s[i] == ')' && index != '(') ||(s[i] == ']' && index != '[') ||(s[i] == '}' && index != '{')) {return false;}}}return num1 == 0; // 如果所有开括号都匹配上了,返回 true}
};

语法学习
string常用的功能
push_back( )     back( )     pop_back( )     empty( )     

二  计算器

给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。

表达式仅包含非负整数,+, - ,*/ 四种运算符和空格  。 整数除法仅保留整数部分。

示例 1:

输入:"3+2*2"
输出:7

示例 2:

输入:" 3/2 "
输出:1

示例 3:

输入:" 3+5 / 2 "
输出:5

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 不要使用内置的库函数 eval

解题思路
1  把一个式子分成几项来看,这样就可以进行+和-的操作,比如5+6*8,这个就是把6*8看成一项
2  我们要用一个字符来存储这个一个式子的上一个运算符号,初始的运算符号要是+,这样才可以进行初始化
代码

#include <cctype>class Solution {
public:int calculate(string s) {int result = 0;  // 最终结果int num = 0;     // 当前数字int temp = 0;    // 临时结果,用于处理乘除法char lastOp = '+';  // 上一个运算符,初始为 '+'for (int i = 0; i < s.length(); i++) {char c = s[i];// 如果是数字,累积到 numif (isdigit(c)) {num = num * 10 + (c - '0');}// 如果是运算符或者到达字符串末尾if ((!isdigit(c) && c != ' ') || i == s.length() - 1) {// 根据上一个运算符处理当前数字if (lastOp == '+') {result += temp;  // 将临时结果累加到最终结果temp = num;      // 开始新的临时结果} else if (lastOp == '-') {result += temp;  // 将临时结果累加到最终结果temp = -num;     // 开始新的临时结果(负数)} else if (lastOp == '*') {temp *= num;  // 乘法直接计算} else if (lastOp == '/') {temp /= num;  // 除法直接计算}// 更新上一个运算符lastOp = c;num = 0;  // 重置当前数字}}// 将最后的临时结果累加到最终结果result += temp;return result;}
};

这个我们可以举一个例子来进行解释
例子3+2*2

我们的temp和result初始化一定是要为0,初始化的操作符是用来把第一个数字加到最初始的地方的
我们是把一整个式子拆分很多项来进行加,减法的时候直接读取-num就好了,下一次加的时候就是减了

三  设计栈

请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

解题思路,这个就是很简单的栈的操作

#include <stdlib.h>
#include <limits.h>typedef struct {int* data;       // 动态数组存储栈元素int maxsize;     // 栈的最大容量int num;         // 栈顶指针,初始化为-1
} MinStack;/** 初始化栈 */
MinStack* minStackCreate() {MinStack* temp = (MinStack*)malloc(sizeof(MinStack));temp->num = -1;temp->maxsize = 100;temp->data = (int*)malloc(temp->maxsize * sizeof(int));return temp;
}/** 压入元素 */
void minStackPush(MinStack* obj, int x) {if (obj->num == obj->maxsize - 1) {// 栈满时动态扩容obj->maxsize *= 2;obj->data = (int*)realloc(obj->data, obj->maxsize * sizeof(int));}obj->data[++(obj->num)] = x;
}/** 弹出元素 */
void minStackPop(MinStack* obj) {if (obj->num == -1) return; // 栈空时直接返回obj->num--;
}/** 获取栈顶元素 */
int minStackTop(MinStack* obj) {if (obj->num == -1) return -1; // 栈空时返回特定值return obj->data[obj->num];
}/** 获取栈中最小值 */
int minStackGetMin(MinStack* obj) {if (obj->num == -1) return -1; // 栈空时返回特定值int min = obj->data[0];for (int i = 0; i <= obj->num; i++) {if (obj->data[i] < min) {min = obj->data[i];}}return min;
}/** 释放栈 */
void minStackFree(MinStack* obj) {free(obj->data);free(obj);
}

扩容的操作不要忘记了还有relloc这个函数,然后不断地加这个索引进行赋予元素进入数组

总结
有效地括号
这个是利用string进行高效地操作,最关键的一步就是要不断地取最后的那一个进行跟闭括号进行比对,从而得出结果
情况1  没有元素
情况2  开始就是闭括号
情况3  没有全部处理完

计算器
要把计算器的的result和lastop和num都初始化为0,然后进行分项,分别利用加法加入到result里面
情况1  在过程进行相加
情况2  在末尾进行相加
乘法和除法可以先用项来进行保存,然后后面遇到加法和减法的时候就直接加这个项数了

设计栈
这里的操作跟我们一般的栈操作差不多
我们要设计出一个可以扩栈的操作可以利用relloc这个函数

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

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

相关文章

YAML是什么?

YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种以数据为中心、高度可读的序列化语言&#xff0c;广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析&#xff1a; 1. 定义与历史演变 全称与定位&#xff1a; YAML的全称最初为“Yet…

熔断降级(Sentinel解决)

问题概述 在微服务架构中一定要预防微服务雪崩问题&#xff0c;微服务雪崩问题就是指在微服务架构中&#xff0c;当一个服务出现故障时&#xff0c;由于服务之间的依赖关系&#xff0c;故障可能会传播到其他服务&#xff0c;从而导致了大规模的服务失败&#xff0c;系统无法正…

反序列化漏洞

前提概要 本文章主要用于分享反序列化漏洞基础学习&#xff0c;以下是对反序列化漏洞的一些个人解析&#xff0c;请大家结合参考其他文章中的相关信息进行归纳和补充。 反序列化漏洞描述 反序列化漏洞是指程序在对输入的字节流进行反序列化时&#xff0c;因缺乏充分的验证和过…

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中&#xff0c;设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制&#xff0c;为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度&#xff0c;解析如何利用LuatOS实现Air8201的智能电源…

STM32学习笔记之存储器映射(原理篇)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

合宙780E开发学习-LUATOS-SOC云编译自定义固件

登录https://luatos.com 点击登录&#xff0c;使用合宙erp账号登录即可 点击右上角构建&#xff0c;点击右上角菜单新构建&#xff0c;自定义构建名称&#xff0c;可新建多个 勾选想要的组件 点击右上角保存修改&#xff0c;只有点击准备就绪&#xff08;注意&#xff1a;一定…

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析

一、React 15&#xff08;2016&#xff09; 核心架构&#xff1a;Stack Reconciler&#xff08;栈协调器&#xff09; 工作原理&#xff1a; 同步递归渲染&#xff1a;采用深度优先遍历方式递归处理 Virtual DOM&#xff0c;形成不可中断的调用栈渲染流程&#xff1a;1. 触发 …

【HarmonyOS NEXT】EventHub和Emitter的使用场景与区别

一、EventHub是什么&#xff1f; 移动应用开发的同学应该比较了解EventHub&#xff0c;类似于EventBus。标准的事件广播通知&#xff0c;订阅&#xff0c;取消订阅的处理。EventHub模块提供了事件中心&#xff0c;提供订阅、取消订阅、触发事件的能力。 类似的框架工具有很多…

QT记事本

记事本应用程序提供了基本的文本编辑功能&#xff0c;支持文件的新建、打开、保存和另存为操作&#xff0c;同时具备修改提示和关闭窗口时的保存确认功能。使用 UTF - 8 编码确保了对多语言文本的支持。 1. 项目整体结构 main.cpp&#xff1a;程序的入口点&#xff0c;负责初…

如何用 Postman 发送 POST 请求?

POST 请求是 HTTP 协议中用于提交数据的一种方法&#xff0c;Postman 提供了丰富的功能来支持用户发送包含各种信息的 POST 请求&#xff0c;如文本数据、JSON 或 XML 数据结构、文件等。 Postman 发送 post 请求教程

Ant Design Vue 中的table表格高度塌陷,造成行与行不齐的问题

前言&#xff1a; Ant Design Vue: 1.7.2 Vue2 less 问题描述&#xff1a; 在通过下拉框选择之后&#xff0c;在获取接口数据&#xff0c;第一列使用了fixed:left&#xff0c;就碰到了高度塌陷&#xff0c;查看元素的样式结果高度不一致&#xff0c;如&#x…

Flink 通过 Chunjun Oracle LogMiner 实时读取 Oracle 变更日志并写入 Doris 的方案

文章目录 一、 技术背景二、 关键技术1、 Oracle LogMiner2、 Chunjun 的 LogMiner 关键流程3、修复 Chunjun Oracle LogMiner 问题 一、 技术背景 在大数据实时同步场景中&#xff0c;需要将 Oracle 数据库的变更数据&#xff08;CDC&#xff09; 采集并写入 Apache Doris&am…

qt+opengl 加载三维obj文件

1前面我们已经熟悉了opengl自定义顶点生成一个立方体&#xff0c;并且我们实现了立方体的旋转&#xff0c;光照等功能。下面我们来用opengl来加载一个obj文件。准备我们首先准备一个简单的obj文件&#xff08;head.obj&#xff09;。资源在本页下载 2 在obj文件里面&#xff0c…

计算机组成原理的学习day01

一 计算机系统层次结构 1 计算机硬件的基本组成 好的&#xff0c;上个小节中我们了解了计算机系统的概念&#xff0c;还有计算机的一个发展历程&#xff0c;那这个小节中我们会着重的探讨计算机硬件的一个基本组成。我们需要掌握这样的两种结构&#xff0c;第一种是早期的冯诺…

ASP 应用HTTP.SYS短文件文件解析Access 注入数据库泄漏

#ASP- 默认安装 -MDB 数据库泄漏下载&#xff08;路径是知道的话可以直接下载&#xff09; 由于大部分 ASP 程序与 ACCESS 数据库搭建&#xff0c;但 ACCESS 无需连接&#xff0c;都在脚本文件中定 义配置好数据库路径即用&#xff0c;不需要额外配置安装数据库&#x…

Redis 版本演进及主要新特性

Redis 版本发布历史 稳定版本时间线 Redis 2.6 (2012年)Redis 2.8 (2013年11月)Redis 3.0 (2015年4月) - 首次支持集群Redis 3.2 (2016年5月)Redis 4.0 (2017年7月)Redis 5.0 (2018年10月)Redis 6.0 (2020年4月)Redis 6.2 (2021年2月)Redis 7.0 (2022年4月) - 最新稳定版(截至…

从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?

小T导读&#xff1a;TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务&#xff0c;轻松应对海量功率、电能及输入输出数据的实时统计与分析&#xff0c;并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外&#xff0c;taosX 强大的 transform 功能帮助用…

NVM安装速通使用手册(Windows版)NVM管理node版本命令手册 NVM使用手册

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的命令行工具。通过nvm&#xff0c;你可以在同一台机器上安装和切换多个Node.js版本&#xff0c;非常适合开发和测试在不同Node.js版本上运行的应用程序 一、安装地址 1. 官方下载&#xff1a; &…

qt QQuaternion详解

1. 概述 QQuaternion 是 Qt 中用于表示三维空间中旋转的四元数类。它包含一个标量部分和一个三维向量部分&#xff0c;可以用来表示旋转操作。四元数在计算机图形学中广泛用于平滑的旋转和插值。 2. 重要方法 默认构造函数 QQuaternion::QQuaternion(); // 构造单位四元数 (1…

Axure项目实战:智慧城市APP(四)医疗信息(动态面板、选中交互应用)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;智慧城市APP医疗信息模块 主要内容&#xff1a;医疗信息模块原型设计与交互 应用场景&#xff1a;医疗信息行业 案例展示&#xff1a; 案例视频&…