【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.mzph.cn/diannao/74365.shtml

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

相关文章

蓝桥杯 劲舞团

问题描述 小蓝最近迷上了一款名为 “劲舞团” 的游戏。 在游戏中&#xff0c;只要按照给出的键位提示依次按出对应的键位&#xff0c;游戏人物便可以跟随节奏跳舞。 对于连续的 K 次正确敲击&#xff0c;如果任意连续两次敲击之间的时间间隔都小于等于 1 秒&#xff08;即 1…

数据库数值函数详解

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 数值函数是数据库中用于处理数值数据的函数,可以用于执行各种数学运算、统计计算等。数值函数在数据分析及处理时非常重要,能够帮助我们进行数据的聚合、计算和转换。在本篇博客中,我们将详细介绍常用的…

关于金融开发领域的一些专业知识总结

目录 1. 交易生命周期 1.1 证券交易所 1.1.1 交易前 1) 订单生成&#xff08;Order Generation&#xff09; 2) 订单管理&#xff08;Order Management&#xff09; 1.1.2 交易执行 3) 交易匹配&#xff08;Trade Matching&#xff09; 1.1.3 交易后 4) 交易确认&…

Leetcode 3495. Minimum Operations to Make Array Elements Zero

Leetcode 3495. Minimum Operations to Make Array Elements Zero 1. 解题思路2. 代码实现 题目链接&#xff1a;3495. Minimum Operations to Make Array Elements Zero 1. 解题思路 这一题的话核心就是统计对任意自然数 n n n&#xff0c;从 1 1 1到 n n n当中所有的数字对…

Vue 3 + TypeScript 实现视频播放与字幕功能:集成西瓜播放器 XGPlayer

文章目录 1. 前言&#xff1a;视频播放器的重要性2. 准备工作2.1 安装 Vue 3 项目2.2 安装 XGPlayer 和相关依赖 3. 实现视频播放3.1 初始化 XGPlayer 4. 添加字幕功能4.1 配置字幕 4.2 字幕文件格式5. 增加交互性完整的代码&#xff0c;仅供参考6. 总结 在现代 Web 开发中&…

MacOS安装 nextcloud 的 Virtual File System

需求 在Mac上安装next cloud实现类似 OneDrive 那样&#xff0c;文件直接保存在服务器&#xff0c;需要再下载到本地。 方法 在 官网下载Download for desktop&#xff0c;注意要下对版本&#xff0c;千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…

.NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar

示例代码下载&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文档是现代软件开发的支柱。随着 .NET 9 从 Swashbuckle 转向 Microsoft.AspNetCore.OpenApi&#xff0c;开发人员需要新的策略来保持高效。本文探讨了这些变化&#xff0c;并介…

深入剖析Java虚拟机(JVM):从零开始掌握Java核心引擎

&#x1f4cc; 引言&#xff1a;为什么每个Java开发者都要懂JVM&#xff1f; 想象你是一名赛车手&#xff0c;Java是你的赛车&#xff0c;而JVM就是赛车的引擎。 虽然你可以不关心引擎内部构造就能开车&#xff0c;但要想在比赛中获胜&#xff0c;必须了解引擎如何工作&#…

怎么连接linux服务器的桌面

一、使用 VNC&#xff08;Virtual Network Computing&#xff09; 1. 服务器端配置&#xff08;Ubuntu 22.04 示例&#xff09; # 安装 VNC 服务器&#xff08;以 TigerVNC 为例&#xff09; sudo apt update sudo apt install tigervnc-standalone-server tigervnc-xorg-ext…

elasticsearch 通用笔记

文章目录 一、前言二、内容说明1、目录简介2、本文例子前提内容 三、操作内容1、设置ES为服务2、查看健康度参数解析 3、索引相关查询3.1、查询指定索引内容3.1.1、匹配查询3.1.2、精确匹配&#xff08;不尝试分词&#xff09;3.1.3、范围查询3.1.4、id查询3.1.5、通配符及前缀…

windows安装配置FFmpeg教程

1.先访问官网&#xff1a;https://www.gyan.dev/ffmpeg/builds/ 2.选择安装包Windows builds from gyan.dev 3. 下滑找到release bulids部分&#xff0c;选择ffmpeg-7.0.2-essentials_build.zip 4. 然后解压将bin目录添加path系统变量&#xff1a;\ffmpeg-7.0.2-essentials_bui…

强大的AI网站推荐(第二集)—— V0.dev

网站&#xff1a;V0.dev 号称&#xff1a;前端开发神器&#xff0c;专为开发人员和设计师设计&#xff0c;能够使用 AI 生成 React 代码 博主评价&#xff1a;生成的UI效果太强大了&#xff0c;适合需要快速创建UI原型的设计师和开发者 推荐指数&#xff1a;&#x1f31f;&…

c#知识点补充4

1.发布者订阅模式 发布者 订阅者 俩者直接的关联使用

01、聊天与语言模型

一、简单说明模型 LLM目前有两种API提供 LanguageModel&#xff1a;接收一个a作为输入并返回一个b作为输出&#xff0c;这种是已经过时的ChatLanguageModel&#xff1a;接收多个输入&#xff0c;然后返回相应的输出 ChatLanguaggeModel是LangChain4j中LLM交互低级API&#x…

SQL的DCL,DDL,DML和DQL分别是什么

SQL&#xff08;Structured Query Language&#xff09;包括以下四种主要语言类别&#xff0c;分别用于不同的数据库操作&#xff1a; 1. DCL&#xff08;Data Control Language&#xff0c;数据控制语言&#xff09; 用于控制数据库访问权限和安全。 常见命令&#xff1a; …

spring boot maven一栏引入本地包

1、在项目跟目录下建立文件夹&#xff0c;比如libs 2、maven依赖 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.10</version><scope>system</scope>&l…

连续型随机变量及其分布

连续型随机变量 数学公式可以看作一门精确描述事物的语言&#xff0c;比语言尤其是汉语的模糊性精确多了&#xff01;离散型数据的处理可以通过枚举和相加进行处理。而连续型数据则没有办法这样处理。我们必须要通过函数和取值区间还有微积分计算。 &#xff3b;定义1&#x…

AI重构SEO关键词优化路径

内容概要 人工智能技术的深度应用正在推动SEO优化进入全新阶段。传统关键词优化依赖人工经验与静态规则&#xff0c;存在效率瓶颈与策略滞后性缺陷。AI技术通过智能语义分析系统&#xff0c;能够穿透表层词汇限制&#xff0c;精准捕捉用户搜索意图的语义关联网络&#xff0c;结…

turnjs图册翻书效果

npm install https://github.com/igghera/turn.js.git //或者 npm install turn.js //import $ from "jquery"; //记得引入jquery import turn.js; // 引入 Turn.jsimport turn from "/utils/turn.min.js";// 引入 Turn.jsinitBook(length) {var that thi…

用PostgreSQL玩转俄罗斯方块:当SQL成为游戏引擎

当DBA开始摸鱼2025年某深夜&#xff0c;一位不愿透露姓名的DBA为了在监控大屏上隐藏游戏行为&#xff0c;竟用SQL实现了俄罗斯方块&#xff01;从此&#xff0c;SELECT成了方向键&#xff0c;UPDATE成了旋转指令&#xff0c;DELETE成了消除大招。本文将揭秘这个疯狂项目的技术内…