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

【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.xdnf.cn/news/14715.html

相关文章:

  • 【25】木材表面缺陷数据集(有v5/v8模型)/YOLO木材表面缺陷检测
  • Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南
  • 如何制定团队制度?
  • 非对称加密实战:Python实现数字签名
  • 2025年CSS最新高频面试题及核心解析
  • 【C++】哈希表的实现(链地址法)
  • 并行计算与共识机制的创新融合,微美全息探索分片区块链机制
  • 计算机网络:(六)超详细讲解数据链路层 (附带图谱表格更好对比理解)
  • MATLAB GUI界面设计 第三章——仪器组件
  • Spring Boot + Logback MDC 深度解析:实现全链路日志追踪
  • 深入浅出Node.js中间件机制
  • R语言入门课| 05 一文掌握R语言常见数据类型
  • docker启动的rabbitmq搭建并集群和高可用
  • 算法与数据结构:动态规划DP
  • 【时时三省】(C语言基础)指针变量例子
  • Kafka 源码剖析:消息存储与协议实现(二)
  • Perplexity AI:对话式搜索引擎的革新者与未来认知操作系统
  • C++ - 标准库之 <string> npos(npos 概述、npos 的作用)
  • ICML 2025 | 时空数据(Spatial-Temporal)论文总结
  • 【数据结构】七种常见排序算法
  • 商品中心—10.商品B端搜索系统的说明文档
  • 详解Redis数据库和缓存不一致的情况及解决方案
  • WEB3合约开发以太坊中货币单位科普
  • react day.js使用及经典场景
  • 【代码解析】opencv 安卓 SDK sample - 1 - HDR image
  • SQL 分页方法全解析:从基础到高级应用
  • 深入解析ID3算法:信息熵驱动的决策树构建基石
  • 【Qt开发】网络运用
  • 项目中后端如何处理异常?
  • JAVA锁机制:对象锁与类锁