LeetCode_栈和队列相关OJ题目

✨✨所属专栏:LeetCode刷题专栏✨✨

✨✨作者主页:嶔某✨✨

上一篇:数据结构_栈和队列(Stack & Queue)-CSDN博客 

 有效的括号

解析:

这里我们用数组实现的栈来解决这个问题,在有了栈的几个基础接口之后,我们运用这几个接口解决问题。

首先新建一个栈并初始化,进入循环如果当前指针指向的字符元素为左括号 {([ 就入栈,反之就出栈,之后判断指针指向的字符是否和出栈的字符左右括号相匹配。

(  (top == '{'&& *s != '}')  ||  (top == '['&& *s != ']')  ||  (top == '('&& *s !=')')  )

 每次循环后s++,如果 *s != '\0' 就进行下一次循环。

写完后提交会发现当只有一个元素的时候这种写法是不能过的

 这里我们在else里面做一个判空,因为如果进了else里面,就说明这是个右括号,那么栈里面一定有其所对应的左括号,如果这时后栈为空,那么显然括号之间是不匹配的。这样就很好的解决了诸如此类的问题。

if(STEmpty(&S))
{
        STDestroy(&S);
        return false;

}

最后s遇到了 '\0' 循环结束,我们判断栈是否为空,如果为空返回true,否则栈中还有元素括号之间也是不匹配的。

return STEmpty(&S);

 可以这么理解这两段代码:一个判断了左括号是否多了,一个判断了右括号是否多了。

 示例代码:

 function/数据结构_栈 · 钦某/c-language-learning - 码云 - 开源中国 (gitee.com)icon-default.png?t=N7T8https://gitee.com/wang-qin928/c-language-learning/tree/master/function/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84_%E6%A0%88

bool isValid(char* s)
{
    ST S;
    STInit(&S);
    while(*s)
    {
        if(*s == '{' || *s == '[' || *s == '(')
        {
            STPush(&S,*s);
        }
        else
        {
            if(STEmpty(&S))
            {
                STDestroy(&S);
                return false;
            }
            char top = STTop(&S);
            STPop(&S);

            if((top == '{'&& *s != '}')||
            (top == '['&& *s != ']') ||
            (top == '('&& *s !=')'))
            {
                STDestroy(&S);
                return false;               
            }
        }
        s++;
    }
    return STEmpty(&S);
}

 用队列实现栈

解析:

这里我们使用数组实现的队列,只需要创建两个队列,把数据在两个队列之间互相导就行了。

定义结构体MyStack:

将mystack结构体里面创建两个队列q1、q2。

myStackCreate函数:

malloc出结构体pst的内存空间 ,并将q1、q2交给 QueueInit函数,返回这个结构体。

myStackPush函数:

将数据方放进 QueuePush,入队列q1就行。

myStackPop函数:

将q1队列的数据转到q2里面,最后剩一个数据不转,直接删除,之后再将数据从q2转到q1里面。返回删除的那个数据。

myStackTop函数:

和上一个函数一样,只不过myStackTop不删除数据,直接返回就好了。

myStackEmpty函数:

return !QueueSize(&(obj->q1));

 myStackFree函数:

这里一定要先释放q1、q2的空间之后再释放pst。

示例代码:

function/队列 · 钦某/c-language-learning - 码云 - 开源中国 (gitee.com)icon-default.png?t=N7T8https://gitee.com/wang-qin928/c-language-learning/tree/master/function/%E9%98%9F%E5%88%97


typedef struct {
    Queue q1;
    Queue q2;
} MyStack;

MyStack* myStackCreate() {
    MyStack* pst = (MyStack*)malloc(sizeof(MyStack));
    QueueInit(&(pst->q1));
    QueueInit(&(pst->q2));

    return pst;
}

void myStackPush(MyStack* obj, int x) {
    QueuePush(&(obj->q1),x);
}

int myStackPop(MyStack* obj) {
    while(QueueSize(&(obj->q1)) != 1)
    {
        QueuePush(&(obj->q2),QueueFront(&(obj->q1)));
        QueuePop(&(obj->q1));
    }
    int tmp = QueueFront(&(obj->q1));
    QueuePop(&(obj->q1));
    while(QueueSize(&(obj->q2)))
    {
        QueuePush(&(obj->q1),QueueFront(&(obj->q2)));
        QueuePop(&(obj->q2));
    }
    return tmp;
}

int myStackTop(MyStack* obj) {
    return QueueBack(&(obj->q1));
}

bool myStackEmpty(MyStack* obj) {
    return !QueueSize(&(obj->q1));
}

void myStackFree(MyStack* obj) {
    Destory(&(obj->q1));
    Destory(&(obj->q2));
    free(obj);
}

 用栈实现队列

解析:

此题与上题思路差不多,有一些细节上的改变,我们在代码里面细说。

定义结构体MyQueue:

创建两个栈st1、st2

myQueueCreate函数:

为MyQueue结构体malloc一块空间,将里面的st1、st2交给 STInit函数。

myQueuePush函数:

直接利用STPush函数插入就行。

myQueuePeek函数:

这里判断一下,如果st2为空的话,就将st1的数据转到st2来,取栈顶元素返回(转过来的时候数据会反过来)如果st2不为空,就直接返回st2栈顶元素。

myQueuePop函数:

这里本来也是要进行判断、转数据的,但是我们可以简化一下代码,直接调用myQueuePeek返回值存起来,这样st2必然就有数据,我们就可以直接pop掉st2里面的数据。

myQueueEmpty函数:

只有st1、st2同时为空,这个队列才为空。

myQueueFree函数:

先用 STDestroy释放掉st1、st2的空间,之后再free掉obj。

总结:此题目不用将st2的数据再转回到st1里,相当于st2是专门用来出数据的,st1专门用来入数据的。

示例代码:

function/数据结构_栈 · 钦某/c-language-learning - 码云 - 开源中国 (gitee.com)icon-default.png?t=N7T8https://gitee.com/wang-qin928/c-language-learning/tree/master/function/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84_%E6%A0%88

typedef struct {
    ST st1;
    ST st2;
} MyQueue;

MyQueue* myQueueCreate() {
    MyQueue* Q = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&(Q->st1));
    STInit(&(Q->st2));
    return Q;
}

void myQueuePush(MyQueue* obj, int x) {
    STPush(&(obj->st1),x);
}

int myQueuePop(MyQueue* obj) {
    int tmp = myQueuePeek(obj);
    STPop(&(obj->st2));
    return tmp;
}

int myQueuePeek(MyQueue* obj) {
    if(STEmpty(&(obj->st2)))
    {
        while(!STEmpty(&(obj->st1)))
        {
            STPush(&(obj->st2),STTop(&(obj->st1)));
            STPop(&(obj->st1));
        }
        return STTop(&(obj->st2));
    }
    else
    {
        return STTop(&(obj->st2));
    }
}

bool myQueueEmpty(MyQueue* obj) {
    return (STEmpty(&(obj->st1)) && STEmpty(&(obj->st2)));
}

void myQueueFree(MyQueue* obj) {
    STDestroy(&(obj->st1));
    STDestroy(&(obj->st2));
    free(obj);
}

本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下班后的空余时间,有什么好的副业方向吗,用心发现适合你的兼职

下班后的空余时间可以利用来开展一些副业,这里我整理了一些,人人可做的 1. 在线教育/培训 如果你是某个领域的专家,可以尝试开展在线教育或培训课程,比如在专业知识、创意设计、编程等领域。 2. 写作/编辑 如果你对写作比较有…

SUSTech组会记录

SUSTech组会记录 2022年2月18日组会记录2022年3月4日组会记录2022年3月11日组会记录2022年3月18日组会记录2022年3月25日组会记录2022年4月2日组会记录2022年4月8日组会记录2022年4月15日组会记录2022年4月22日组会记录2022年4月29日组会记录2020年5月20日组会记录2022年5月27日…

cuttag学习笔记

由于课题可能用上cut&tag这个技术,遂跟教程学习一波,记录一下以便后续的学习(主要是怕忘了) 教程网址cut&tag教程 背景知识:靶标下裂解与标记(Cleavage Under Targets & Tagmentation&#xf…

LearnOpenGL(十二)之Assimp

一、Assimp Assimp(Open Asset Import Library)是一个用于加载和处理三维模型数据的跨平台开源库。它支持许多常见的3D模型格式,包括OBJ、FBX、DAE(Collada)、STL等,使得开发者可以方便地将各种格式的3D模…

五款公司源代码加密软件推荐|代码防泄密解决方案

在当今数字化的世界中,源代码的泄露无疑是一场灾难。对于依赖加密软件保护关键信息的企业和个人来说,这种泄露不仅可能导致数据失窃,还可能损害企业的声誉和客户的信任。面对这种严峻的形势,我们迫切需要一种全面而有效的加密软件…

01-02-5

1、单链表中按位置查找 a.原理 通过传递的位置,返回该位置对应的地址,放到主函数定义的指针变量中。 我们认为位置从:有数据的节点开始计数 即如下结构: 查找位置,就是返回该位置对应的空间地址。 b.代码说明 Ⅰ…

【Unity image 组件介绍】

Unity image 组件介绍 想了解更多游戏开发知识,可以扫描下方二维码,免费领取游戏开发4天训练营课程 在 Unity 中,Image 组件是一个用于显示图像的 UI 元素,是 Unity UI 系统的一部分。Image 组件可以显示简单的颜色方块,也可以显示纹理图像…

第十二讲:指针(4)

第十二讲:指针(4) 1.回调函数1.1什么是回调函数1.2深入理解并使用回调函数1.2.1简单写法1.2.2优化 2.qsort函数详解2.1函数简单介绍2.3qsort函数使用举例2.3.1qsort函数排序整形数据2.3.2qsort函数排序结构数据 3.qsort函数的模拟实现3.1冒泡…

【投稿优惠|快速见刊】2024年能源资源与材料应用国际学术会议(ICERMA 2024)

全称:【投稿优惠|快速见刊】2024年能源资源与材料应用国际学术会议(ICERMA 2024) 会议网址:http://www.icerma.com 会议时间: 2024/2/29 截稿时间:2024/2/20 会议地点: 长沙 投稿邮箱:icermasub-conf.com 投稿标题:ICERMA 2024Art…

esp32-使用UDP控制电机(七)

目录 前言 端口配置 代码 前言 本文基于esp32使用platformio平台,通过udp来控制电机运行。 关键词:platformio,freertos,upd,esp32,motor, 端口配置 采用drv8833驱动板,其中es…

IDEA buid一直不能完成,无法运行

问题如下所示: 解决方案 output 路径不对,正确路径:项目目录\target\classes

【JAVA入门】Day04 - 方法

【JAVA入门】Day04 - 方法 文章目录 【JAVA入门】Day04 - 方法一、方法的格式1.1 无参无返回值的方法定义和调用1.2 带参数的方法定义和调用1.3 形参和实参1.4 带返回值的方法定义和调用1.5 方法的注意事项 二、方法的重载三、方法的使用四、方法的内存原理4.1 方法调用的基本内…

3W 3KVAC隔离 宽电压输入 AC/DC 电源模块——TP03AL系列

TP03AL系列产品具有交直流两用、输入电压范围宽、高可靠性、低功耗、安全隔离等优点。广泛适用于工控和电力仪器仪表、智能家居等对体积要求苛刻、并对EMC 要求不高的场合,如果需要应用于电磁兼容恶劣的环境下必须添加EMC 外围电路。

保研机试之【x86/x86-64体系结构中的寄存器】

先来看一下这六个选项的功能: 举一个例子: 对于CR2寄存器和中断向量表: 也就是先通过CR2寄存器找到引发错误的虚拟地址,然后操作系统分析错误原因,通过IDTR寄存器找到IDT(中断向量表)&#xff0…

Rust 中的mod 使用

1、本文将展示在Rust语言中如何引入模块。 2、项目目录如下图。 2.1、mod.rs中是需要引入的模块代码。 2.2、main.rs和文件夹utils在src文件夹下。 2.3、mod.rs代码如下。 pub mod nation{pub mod government{pub fn govern(){let aString::from("govern");println…

代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 文章目录 代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯理论基础一、常规题目二、解题步骤…

代码随想录算法训练营第二十七天|​回溯法理论基础​、第77题. 组合

理论基础 回溯法基本介绍 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。递归函数的下面就是回溯的逻辑 因为回溯的本质是穷举,穷举所有可能(暴力法),然…

Today At Apple 2024.04.15 Phone15 入门

官网: https://www.apple.com/today/Apple 亚洲第一大商店:Apple 静安零售店现已在上海开幕如下预约课程:下载 Apple Store(不是app store),点击课程预约笔记:Today At Apple Notes果粉加群 &am…

并发编程总结(二)

目录 Java 对象头 wait / notify sleep(long n) 和 wait(long n) 的区别 死锁 定位死锁 饥饿 ReentrantLock Java 对象头 以 32 位虚拟机为例 64 位虚拟机 Mark Word 在程序中查看对象结构&#xff1a; 导入依赖&#xff1a; <!-- https://mvnrepository.com/artifac…

掌握这个Jenkins插件,离测试开发又近一步!

Jenkins Pipeline是一种可编程的、可扩展的持续交付管道&#xff0c;允许您使用脚本来定义整个软件交付过程。 以下是使用Jenkins Pipeline创建和配置流水线的基本步骤。 Part 01. 创建一个Pipeline Job 在Jenkins中创建一个新的"Pipeline"类型的Job。 以下是在J…