当前位置: 首页 > news >正文

【Leetcode】有效的括号、用栈实现队列、用队列实现栈

文章目录

  • 有效的括号
    • 题目链接
    • 题目描述
    • 解题思路
    • 代码
  • 用队列实现栈
    • 题目链接
    • 题目描述
    • 解题思路
    • 代码
  • 用栈实现队列
    • 题目链接
    • 题目描述
    • 解题思路
    • 代码


有效的括号

题目链接

题目链接

题目描述

在这里插入图片描述

解题思路

这道题需要借助栈,所以需要把我们以前实现的栈拷贝过来,具体思路就是遍历整个字符串,遇到左括号就把它入栈,遇到右括号就把右括号和栈顶括号匹配,若匹配成功就把栈顶字符出栈,若匹配不成功就返回false,若程序成功出循环就代表字符串的所有字符都匹配成功,返回true。这个思路整体没问题,但有几个小坑:
1、程序有一个分支结构,左括号和右括号分别进入不同的分支,若进入右括号分支且栈为空,就代表栈里没有字符能和右括号匹配,直接返回false。
2、若出循环后栈里还有字符,代表没有右括号与之匹配,也直接返回false。

代码

bool isValid(char* s) {ST st;STInit(&st);char* pos = s;while(*pos != '\0'){//左括号入栈if(*pos == '(' || *pos == '[' || *pos == '{'){STPush(&st,*pos);}else{//若为右括号且和栈顶不匹配或者栈为空return falseif(STEmpty(&st)){STDestroy(&st);return false;  }char top = STTop(&st);if((*pos == ')' && '(' != top)||(*pos == ']' && '[' != top)||(*pos == '}' && '{' != top)){STDestroy(&st);return false;  }STPop(&st);}pos++;}//若出循环栈不为空更该淘汰bool ret = STEmpty(&st) ? true : false;STDestroy(&st);return ret;
}

用队列实现栈

题目链接

题目链接

题目描述

在这里插入图片描述

解题思路

这道题需要借助两个栈实现应该队列,所以MyStack结构体里包含两个队列。
初步思路:
入栈要选择不为空队列插入,若两个队列都为空,随机挑选一个队列插入数据。出栈要将不为空队列的前size-1个数据导入到另一个空队列,在将不为空队列剩余的一个数据出队列。返回栈顶元素不用导数据,直接取不为空队列的队尾数据。
具体接口实现如下:
初始化栈: 该题需要自己开空间,然后返回指向该空间的指针,所以先开MyStack大小的空间,然后分别初始化两个队列。
入栈: 找到非空队列将数据插入队列,若两个队列都为空,则随机找一个队列插入。
出栈: 需要先找到空队列和非空队列,先将非空队列的前size-1个数据全部转移道空队列,然后将非空队列剩余的一个数据出队列,并将它的值返回。
取栈顶: 直接返回不为空队列的队尾数据。
判空: 若两个队列都为空则栈为空,否则栈不为空。
销毁: 不仅要释放两个队列,我们malloc的MyStack也要释放。

代码

typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {//自己开空间MyStack* stp = (MyStack*)malloc(sizeof(MyStack));QueueInit(&stp->q1);QueueInit(&stp->q2);return stp;
}//往不为空的队列插入,若都为空则随机插入
void myStackPush(MyStack* obj, int x) 
{if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1, x);}else{QueuePush(&obj->q2, x);}
}int myStackPop(MyStack* obj) 
{//指鹿为马,判断队列空与非空Queue* emp = &obj->q1;Queue* noemp = &obj->q2;if(QueueEmpty(noemp)){emp = &obj->q2;noemp = &obj->q1;}//导数据while(QueueSize(noemp) > 1){QueuePush(emp, QueueFront(noemp));QueuePop(noemp);}//将非空队列的最后一个数据出队列并返回非空队列最后一个数据int tmp = QueueFront(noemp);QueuePop(noemp);return tmp;
}int myStackTop(MyStack* obj) {//返回不为空队列的队尾if(!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);obj = NULL;
}

用栈实现队列

题目链接

题目链接

题目描述

在这里插入图片描述

解题思路

这道题两个栈分别承担不同的功能,一个pushst用来入数据,一个popst用来出数据,入数据时无需判断,直接pushst入栈就行了,出数据需要先判断popst是否为空,若不为空则popst出栈,若popst为空则需要先将pushst内所有数据导到popst,再将popst出栈,top思路和pop大致相同,只不过不用删除popst栈顶数据,其他接口和上一题类似,若读者感觉比较难想画一画图思路自然就有了。

代码

typedef struct {//入数据栈ST pushst;//出数据栈ST popst;
} MyQueue;MyQueue* myQueueCreate() {//自己开空间MyQueue* mqp= (MyQueue*)malloc(sizeof(MyQueue));STInit(&mqp->pushst);STInit(&mqp->popst);return mqp;
}void myQueuePush(MyQueue* obj, int x) {STPush(&obj->pushst, x);
}int myQueuePop(MyQueue* obj) {if(STEmpty(&obj->popst)){//若popst为空,将pushst数据全部导到popst后再出栈while(!STEmpty(&obj->pushst)){STPush(&obj->popst, STTop(&obj->pushst));STPop(&obj->pushst);}}//popst不为空,直接出栈int tmp = STTop(&obj->popst);STPop(&obj->popst);return tmp;
}int myQueuePeek(MyQueue* obj) {//若popst为空,将pushst数据全部导到popst后再返回popst栈顶数据if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){int tmp = STTop(&obj->pushst);STPop(&obj->pushst);STPush(&obj->popst, tmp);}}//若popst不为空,直接返回栈顶数据return STTop(&obj->popst);
}bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->popst) && STEmpty(&obj->pushst);
}void myQueueFree(MyQueue* obj) {STDestroy(&obj->popst);STDestroy(&obj->pushst);free(obj);obj = NULL;
}

以上就是小编分享的全部内容了,如果觉得不错还请留下免费的赞和收藏
如果有建议欢迎通过评论区或私信留言,感谢您的大力支持。
一键三连好运连连哦~~

在这里插入图片描述

http://www.lryc.cn/news/574172.html

相关文章:

  • Spring Boot + Logback MDC 深度解析:实现全链路日志追踪
  • 从数据到洞察:UI前端如何利用大数据优化用户体验
  • 用Fiddler抓包工具优化API联调流程:与Postman、Wireshark协作实践分享
  • Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南
  • 在Ubuntu上设置Firefox自动化测试环境:指定Marionette端口号
  • SpringBoot+Vue自习室座位预约系统
  • Lamp和友点CMS一键部署脚本(Rocky linux)
  • 技术干货 | 深度解读GB/T 45086.1-2024 EMC部分关键项
  • Excel学习03
  • 如何在 Vue 应用中嵌入 ONLYOFFICE 编辑器
  • 零基础学习RabbitMQ(2)--Linux安装RabbitMQ
  • 16.数据聚合
  • 文章以及好用网站分享
  • [QMT量化交易小白入门]-六十六、加入评分阈值后,历史回测收益率达到74%
  • Matlab自学笔记六十:符号表达式的缩写和简化
  • <tauri><threejs><rust><GUI>基于tauri和threejs,实现一个3D图形浏览程序
  • WPF中MVVM和MVVMLight模式
  • 技术逐梦之旅:从C语言到Vue的成长之路
  • 【附源码】考试报名系统设计与实现+SpringBoot + Vue (前后端分离)
  • Java底层原理:深入理解类加载机制与反射
  • 开始读Learning PostgresSQL第二版
  • C# SolidWorks二次开发-实战2,解决SolidWorks2024转step文件名乱码问题
  • STM32和C++ 实现配置文件导入、导出功能
  • 【技术分享】XR技术体系浅析:VR、AR与MR的区别、联系与应用实践
  • 使用CloudFormation模板自动化AWS基础设施的部署
  • 【第二章:机器学习与神经网络概述】03.类算法理论与实践-(2)朴素贝叶斯分类器
  • Auto-GPT vs ReAct:两种智能体思路对决
  • 【MySQL基础】MySQL复合查询全面解析:从基础到高级应用
  • 左神算法之给定一个数组arr,返回其中的数值的差值等于k的子数组有多少个
  • Flask学习笔记