当前位置: 首页 > 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.lqws.cn/news/491671.html

相关文章:

  • 数据赋能(313)——合作共享——跨界融合
  • STM32 ADC(DMA)双缓冲采集+串口USART(DMA)直接传输12位原始数据到上位机显示并保存WAV格式音频文件 收藏住绝对实用!!!
  • 马斯克YC技术核弹全拆解:Neuralink信号编译器架构·星舰着陆AI代码·AGI防御协议(附可复现算法核心/开源替代方案/中国技术对标路径)
  • CSS 中aspect - ratio属性的用途及应用
  • Mermaid学习第二部
  • Netty内存池核心:PoolChunkList解析
  • 【附源码】考试报名系统设计与实现+SpringBoot + Vue (前后端分离)
  • 【Linux网络编程】五种IO模型与非阻塞IO
  • 树莓派5+Ubuntu24.04 LTS ROS2 Jazzy安装 保姆级教程
  • transformer-kv缓存
  • Docker健康检查
  • 【AI News | 20250623】每日AI进展
  • 开发Qt程序时,为什么是CMake?
  • 前端截图并导出pdf
  • 基于Django和MySQL的智能图像分类与情感分析系统
  • Nginx-前端跨域解决方案!
  • AI+地图打车:如何用机器学习实现小程序订单智能匹配与路径优化?
  • 征服分布式系统:阿里云 Linux 多机互联与资源共享实战指南
  • 区块链大讲堂 | 分布式隐私计算友好的零知识证明协议
  • 基于PostgreSQL的百度或高德等POI多层级分类的数据库设计
  • [Java恶补day31] 21. 合并两个有序链表
  • 【ARM 嵌入式 编译系列 7.5 -- GCC 打印链接脚本各段使用信息】
  • 华为OD机试_2025 B卷_矩形相交的面积(Python,100分)(附详细解题思路)
  • 联合语音和文本机器翻译,支持多达100种语言(nature子刊论文研读)
  • Restormer: Efficient Transformer for High-Resolution Image Restoration 论文阅读
  • 树莓派超全系列教程文档--(66)rpicam-apps可用选项介绍之视频选项
  • 2025年CCF先进音频技术竞赛
  • sublime 4200 激活
  • K8S: etcdserver: too many requests
  • 计算机网络:(六)超详细讲解数据链路层 (附带图谱表格更好对比理解)