【day2】数据结构刷题 栈

news2025/4/24 0:15:55

一  有效的括号

给定一个只包括 (){}[] 的字符串 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; // 如果没有开括号可匹配,返回 false
                char 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];

            // 如果是数字,累积到 num
            if (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.coloradmin.cn/o/2320913.html

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

相关文章

第16章:基于CNN和Transformer对心脏左心室的实验分析及改进策略

目录 1. 项目需求 2. 网络选择 2.1 UNet模块 2.2 TransUnet 2.2.1 SE模块 2.2.2 CBAM 2.3 关键代码 3 对比试验 3.1 unet 3.2 transformerSE 3.3 transformerCBAM 4. 结果分析 5. 推理 6. 下载 1. 项目需求 本文需要做的工作是基于CNN和Transformer的心脏左心室…

云上 Redis 迁移至本地机房

文章目录 摘要在 IDC 搭建读写分离 redis 集群一、环境准备二、部署主从架构1. 安装Redis2. 配置主节点3. 配置从节点4. 所有 Redis 节点设置开机自启动三、部署代理层(读写分离)1. 安装Twemproxy2. 配置Twemproxy3. 配置开机自启动四、高可用配置(哨兵模式)1. 配置哨兵节点…

SQL Server——表数据的插入、修改和删除

目录 一、引言 二、表数据的插入、修改和删除 &#xff08;一&#xff09;方法一&#xff1a;在SSMS控制台上进行操作 1.向表中添加数据 2.对表中的数据进行修改 3.对表中的数据进行删除 &#xff08;二&#xff09;方法二&#xff1a;使用 SQL 代码进行操作 1.向表中添…

deepSeek-SSE流式推送数据

1、背景 DeepSeek作为当前最火的AI大模型&#xff0c; 使用的时候用户在输入框输入问题&#xff0c;大模型进行思考回答你&#xff0c;然后会有一个逐步显示的过程效果&#xff0c;而不是一次性返回整个答案给前端页面进行展示&#xff0c;为了搞清楚其中的原理&#xff0c;我们…

【北京迅为】iTOP-RK3568开发板OpenHarmony系统南向驱动开发UART接口运作机制

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

C#实现自己的Json解析器(LALR(1)+miniDFA)

C#实现自己的Json解析器(LALR(1)miniDFA) Json是一个用处广泛、文法简单的数据格式。本文介绍如何用bitParser&#xff08;拥有自己的解析器&#xff08;C#实现LALR(1)语法解析器和miniDFA词法分析器的生成器&#xff09;迅速实现一个简单高效的Json解析器。 读者可在&#xf…

机器学习——KNN数据均一化

在KNN&#xff08;K-近邻&#xff09;算法中&#xff0c;数据均一化&#xff08;归一化&#xff09;是预处理的关键步骤&#xff0c;用于消除不同特征量纲差异对距离计算的影响。以下是两种常用的归一化操作及其核心要点&#xff1a; 质押 一 、主要思想 1. 最值归一化&#…

异步编程与流水线架构:从理论到高并发

目录 一、异步编程核心机制解析 1.1 同步与异步的本质区别 1.1.1 控制流模型 1.1.2 资源利用对比 1.2 阻塞与非阻塞的技术实现 1.2.1 阻塞I/O模型 1.2.2 非阻塞I/O模型 1.3 异步编程关键技术 1.3.1 事件循环机制 1.3.2 Future/Promise模式 1.3.3 协程&#xff08;Cor…

哈尔滨工业大学DeepSeek公开课人工智能:大模型原理 技术与应用-从GPT到DeepSeek|附视频下载方法

导 读INTRODUCTION 今天继续哈尔滨工业大学车万翔教授带来了一场主题为“DeepSeek 技术前沿与应用”的报告。 本报告深入探讨了大语言模型在自然语言处理&#xff08;NLP&#xff09;领域的核心地位及其发展历程&#xff0c;从基础概念出发&#xff0c;延伸至语言模型在机器翻…

Excel处理控件Spire.XLS系列教程:C# 在 Excel 中添加或删除单元格边框

单元格边框是指在单元格或单元格区域周围添加的线条。它们可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引读者注意重要的单元格或使工作表看起来更美观。本文将介绍如何使用 Spire.XLS for .NET 在 C# 中添加或删除 Excel 单元格边框。 安装 Spire.XLS for .NET E-…

Web开发-JS应用NodeJS原型链污染文件系统Express模块数据库通讯

知识点&#xff1a; 1、安全开发-NodeJS-开发环境&功能实现 2、安全开发-NodeJS-安全漏洞&案例分析 3、安全开发-NodeJS-特有漏洞 node.js就是专门运行javascript的一个应用程序&#xff0c;区别于以往用浏览器解析原生js代码&#xff0c;node.js本身就可以解析执行js代…

国产达梦(DM)数据库的安装(Linux系统)

目录 一、安装前的准备工作 1.1 导包 1.2 创建用户和组 1.3 修改文件打开最大数 1.4 目录规划 1.5 修改目录权限 二、安装DM8 2.1 挂载镜像 2.2 命令行安装 2.3 配置环境变量 2.4 启动图形化界面 三、配置实例 四、注册服务 五、启动 停止 查看状态 六、数据库客…

git的底层原理

git的底层原理 三段话总结git&#xff0c; 1. 工作原理&#xff1a;git管理是一个DAG有向无环图&#xff0c;HEAD指针指向branch或直接指向commit&#xff0c;branch指向commit&#xff0c;commit指向tree&#xff0c;tree指向别的tree或直接指向blob。 2. git所管理的一个目录…

MATLAB+Arduino利用板上的按键控制板上Led灯

几年不使用&#xff0c;之前的知识都忘掉了。需要逐步捡起来。 1 熟悉按键的使用 2熟悉灯的控制 1 电路 我们将通过 MATLAB 的 Arduino 支持包与 Arduino 板通信&#xff0c;读取按键状态并控制 LED 灯的亮灭。 按键&#xff1a;连接到 Arduino 的数字引脚&#xff08;例如…

Cocos Creator Shader入门实战(五):材质的了解、使用和动态构建

引擎&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 前面的几篇文章&#xff0c;讲述的主要是Cocos引擎对Shader使用的一些固定规则&#xff0c;这里汇总下&#xff1a; 一、Shader实现基础是OpenGL ES可编程渲染管线&#xff0c;开发者只需关注顶点着色器和…

vue设置自定义logo跟标题

准备 Logo 图片 将自定义的 Logo 图片&#xff08;如 logo.png&#xff09;放置在项目的 public文件夹下。 使用环境变量设置 Logo 和标题&#xff08;可选&#xff09; 创建或修改 .env 文件 在项目根目录下创建或修改 .env 文件&#xff0c;添加以下内容&#xff1a; VITE_A…

尝试在软考65天前开始成为软件设计师-计算机网络

OSI/RM 七层模型 层次名功能主要协议7应用层实现具体应用功能 FTP(文件传输)、HTTP、Telnet、 POP3(邮件)SMTP(邮件) ------- DHCP、TFTP(小文件)、 SNMP、 DNS(域名) 6表示层数据格式,加密,压缩.....5会话层建立,管理&终止对话4传输层端到端连接TCP,UDP3网络层分组传输&a…

VMware主机换到高配电脑,高版本系统的问题

原来主机是i3 ,windows7系统&#xff0c;vmware 14.0,虚机系统是ubuntu 14.04。目标新机是i7 14700KF,windows11系统。原以为安装虚拟机&#xff0c;将磁盘文件&#xff0c;虚拟机配置文件拷贝过去可以直接用。 新目标主机先安装了vmware 15&#xff0c;运行原理虚机&#xff0…

【Linux内核系列】:动静态库详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 有些鸟儿是注定是关不住的&#xff0c;因为它们的每一片羽翼都沾满了自由的光辉 ★★★ 本文前置知识&#xff1a; 编译与链接的过程…

windows环境下NER Python项目环境配置(内含真的从头安的perl配置)

注意 本文是基于完整项目的环境配置&#xff0c;即本身可运行项目你拿来用 其中有一些其他问题&#xff0c;知道的忽略即可 导入pycharm基本包怎么下就不说了&#xff08;这个都问&#xff1f;给你一拳o(&#xff40;ω*)o&#xff09; 看perl跳转第5条 1.predict报错多个设备…