LeetCode_栈和队列相关OJ题目

news2024/11/27 14:33:18

✨✨所属专栏: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);
}

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

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

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

相关文章

【Esp32S3 | Arduino】在Arduino中使用C++的高级特性

文章目录 前言一、Arduino中的Vector示例代码二、Arduino中的Map示例代码前言 最近在玩Arduino,自上次发现Arduino可以用Template,能使用高级宏后,这次发现Arduino竟可以使用C++中的一些STL容器,这属实令人震惊。起因是我打算做一个动态的数组,但是手动实现一些操作属实麻烦…

如何使用Docker安装并运行Nexus容器结合内网穿透实现远程管理本地仓库

前言 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊如何使用Docker安装并运行Nexus容器结合内网穿透实现远程管理本地仓库,希望大家能觉得实用! 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!&#x1f496…

‘vue-cli-service‘ is not recognized as an internal or external command解决方案

vue-cli-service is not recognized as an internal or external command, operable program or batch file.解决方案 先进行 : npm install -g vue/cli 命令安装vue cli 是必须的。 如果 npm run build 还是报错 遇到同样的提示: 这时候先安装依赖 np…

树莓派|采集视频并实时显示画面

1、使用SSH远程连接到树莓派 2、新建存放代码的目录 mkdir /home/pi/my_code_directory 3、进入存放代码的目录 cd /home/pi/my_code_directory 4、新建py文件 nano cv2test.py 5、输入代码 import cv2# 打开摄像头 cap cv2.VideoCapture(0)while True:# 读取视频帧ret…

产品推荐 | 基于Intel (Altera) Cyclone V打造的水星Mercury SA1核心板

01 产品概述 水星Mercury SA1片上系统(SoC)核心板通过结合基于ARM处理器的SoC FPGA、快速DDR3L SDRAM、eMMC flash、QSPI flash、Gigabit Ethernet PHY和RTC形成了一个高性能嵌入式处理方案,结合了CPU系统的灵活性和FPGA原始的、实时的并行处…

软件测试总体报告(实际项目原件Word参考)

软件全套精华资料包清单部分文件列表: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书,概要设计说明书&#xff0c…

信创应用软件之邮箱

信创应用软件之邮箱 文章目录 信创应用软件之邮箱采用信创邮箱的必要性信创邮箱采购需求国产邮箱业务形态国产邮箱代表性品牌CoremailRichmail安宁eyouUMail拓波 邮件安全的发展阶段 采用信创邮箱的必要性 邮箱是天然的数据存储空间,党政和央国企客户在使用过程中存…

如何在 Python 中使变量不可继承

1. 问题背景 在 Python 中,子类可以继承父类的属性和方法。但是,有时我们希望子类不能继承父类的某些属性或方法。这种情况下,该如何做呢? 2. 解决方案 解决方案一:使用双下划线前缀 Python 中的双下划线前缀用于表…

【软考网络工程师】每日练题学知识

1.在EIGRP协议中,某个路由器收到了两条路径到达目标网络,路径1的带宽为100Mbps,延迟2ms,路径2的带宽为50Mbps,迟为4ms,如果EIGRP使用带宽和延迟的综合度量标准,那么该路由器选择的最佳路径是&am…

学习Uni-app开发小程序Day10

前面学习了局部组件的创建和简单使用&#xff0c;今天学习了slot&#xff08;插槽&#xff09;和组件之间的传值1. 插槽的使用 在components中&#xff0c;创建一个组件&#xff0c;给组件设置头部布局、内容布局、底部布局&#xff0c;例如&#xff1a; <template><…

Goby 漏洞发布|瑞友天翼应用虚拟化系统 /hmrao.php SQL注入漏洞

漏洞名称&#xff1a;瑞友天翼应用虚拟化系统 /hmrao.php SQL注入漏洞 English Name&#xff1a; Ruiyou-Tianyi-App-Virtualization-Delivery-Platform /hmrao.php SQL Injection Vulnerability CVSS core: 9.8 影响资产数&#xff1a;75202 漏洞描述&#xff1a; 瑞友天…

抖音上有可以长久赚钱的副业吗?当然有,只有它最稳定长久!

大家好&#xff0c;我是电商糖果 现在有很多年轻人在大城市上班&#xff0c;发现辛辛苦苦一年也赚不到多少钱。 如果说自己有了房贷&#xff0c;车贷&#xff0c;那更是一点儿不敢歇。 为了可以有更多的收入&#xff0c;年轻人都希望可以靠着下班时间&#xff0c;找一个可以…

基于51单片机的电子门铃设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机电子门铃设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0091 1. 主要功能&#xff1a; 基于51单片机的智能门铃设计 1、系统采用…

论文查重率好高啊,怎论文降重怎么降?aigc降低怎么改?

论文降重成功了&#xff0c;知网查重8%&#xff0c;aigc检测0%&#xff01;本人之前分享过一些关于论文方面的内容&#xff0c;然后就有好多同学在后台问毕业论文降重和aigc减低的方法&#xff0c;由于本人时间问题&#xff0c;实在不能第一时间给大家一一回复&#xff0c;请大…

文本处理三剑客grep,awk,sed-读书笔记(十四)

文本处理三剑客{ 1.内容过滤器 > grep 2.文本分析器 > awk 3.行文本处理器 > sed } grep内容过滤器 grep命令是Linux系统中一个非常强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。grep全称是Global Regular Expr…

Multisim14 安装教程

1、下载压缩包 链接&#xff1a;https://pan.baidu.com/s/1L50kBBKWFtud6GhmmqHLiw?pwd8888 提取码&#xff1a;8888 2、解压 3、运行应用程序&#xff0c;开始安装&#xff0c; 4、点击确定 5、点击unzip&#xff0c;解压 6、点击确定 7、点击安装 8、填写name和organ&a…

深入探索不相交集合:链表表示与加权合并策略的实现

深入探索不相交集合&#xff1a;链表表示与加权合并策略的实现 1. MAKE-SET 操作伪代码C语言实现 2. FIND-SET 操作伪代码C语言实现 3. UNION 操作伪代码C语言实现 4. 集合对象和表对象的属性5. 总结 在本文中&#xff0c;我们将探讨如何使用链表表示和加权合并启发式策略来实现…

研究生通用学术英语写作(刘美岩)教材电子版分享

研究生通用学术英语写作电子版资源分享 本着开源的思想&#xff0c;为了实现互通有无&#xff0c;诸位需要研究生通用学术英语写作电子版资源的朋友可以直接微信关注下面公众号&#xff0c;或者手动搜索莲花百货铺&#xff0c;在公众号中直接输入书名就可获得网盘链接&#xff…

运维必备 | 《K8s故障排查手册》,强烈建议收藏!!

新手在使用K8s时经常出现各种故障&#xff0c;有些故障不知道背后原因&#xff0c;迟迟不能解决。今天就分享一份大佬总结的K8s常见问题故障排查手册&#xff0c;超级实用&#xff0c;运维及K8s使用者一定要收藏备用&#xff01; 简介 这份《K8s故障排查手册》&#xff0c;共…

电子作业指导书系统如何提升医疗设备工厂的生产效率

在医疗设备工厂中&#xff0c;电子作业指导书&#xff08;ESOP&#xff09;正逐渐成为提升生产效率的关键因素。 一、电子作业指导书系统提供了即时可得的准确信息。 电子作业指导书系统与传统的纸质作业指导书相比&#xff0c;员工可以在工作现场通过电子设备随时查阅最新、最…