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);
}

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

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

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

相关文章

vue3.0(七) 计算属性(computed)

文章目录 1 计算属性(computed )1.1 computed使用1.2 computed使用场景1.4 computed的注意点1.4 computed的原理1.5 computed的示例 computed 和 Methods 的区别 1 计算属性(computed ) 在 Vue 3 中,computed 是一个用…

linux笔记5--shell命令2

文章目录 一. linux中的任务管理1. 图形界面2. 命令① top命令② grep命令③ ps命令补充: ④ kill命令图形界面杀死进程 二. 挂载(硬盘方面最重要的一个知识点)1. 什么是挂载2. 关于挂载目录① Windows② linux查看硬件分区情况(/dev下):更改挂载目录结束…

视频剪辑的技巧:掌握如何高效批量调整视频尺寸的方法

在视频剪辑的过程中,调整视频尺寸是一个常见的需求。无论是为了适应不同平台的播放要求,还是为了统一多个视频的尺寸以提升观看体验,掌握高效批量调整视频尺寸的技巧都显得尤为重要。本文将为您详细介绍云炫AI智剪如何高效地进行这一操作&…

【计算机网络】数据链路层 组帧 习题4

组帧 发送方根据一定的规则将网络层递交的分组封装成帧(也称为组帧)。 组帧时,既要加首部,也要加尾部,原因是,在网络信息中,帧是以最小单位传输的。所以接收方要正确地接收帧,就必须清楚该帧在一串比特串中…

Find My腰包|苹果Find My技术与腰包结合,智能防丢,全球定位

腰包具有显瘦和显高的双重功效,它不仅能提高腰线、拉长腿部线条,还能遮住腹部多余的赘肉,从而在视觉上达到变高的效果,使整体看起来更加显瘦。除了时尚功能,腰包在运动中也有其独特的用途。例如,在跑步时&a…

tab 滑动小案例

效果&#xff1a; 代码&#xff1a; <template><view class"content"><view class"tab"><view v-for"(item,index) in dataList" :key"index" class"tab_item" click"slideTab(index)">…

48.乐理基础-音符的组合方式-休止符

休止符 音乐中总有一些停顿的地方&#xff0c;一次停顿多久是创作人固定好的&#xff0c;休止符就是用来表示每一次停顿多久 需要停顿的位置就用 0 来表示&#xff0c;数字 0 就是简谱中的休止符 音符有全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等&…

Spring Boot项目怎么集成Gitee登录

一、背景 现在的越来越多的项目&#xff0c;需要集成第三方系统进行登录。今天我们以Spring Boot项目集成Gitee为例&#xff0c;演示一下怎么使用Oauth2协议&#xff0c;集成第三方系统登录。 不了解oauth2的&#xff0c;可以看我之前的文章。Ouath2是怎么实现在第三方应用认…

PyQt6--Python桌面开发(12.QpushButton按钮控件)

一.按钮类控件 二.QpushButton按钮控件 2.1QAbstractButton类属性 2.2QpushButton类属性

Handler详解

文章目录 主线程和子线程消息机制作用原理内存泄露HandlerThread含义 线程池参考链接 主线程和子线程 从用途上来说Android的线程主要分为主线程和子线程两类&#xff0c;主线程主要处理和界面相关的工作&#xff0c;子线程主要处理耗时操作。除Thread之外&#xff0c;Android…

背完这些软件测试核心面试题,offer轻松拿捏了!

你赞同过 软件测试和开发 相关内容 01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法和…

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

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