当前位置: 首页 > 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;
}

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

在这里插入图片描述

相关文章:

  • 成都芯谷金融中心文化科技产业园:构建文化科技产业融合新标杆
  • MySQL 8.x配置MGR高可用+ProxySQL读写分离(二):ProxySQL配置MySQL代理及读写分离
  • 【GoLang】3、基于虚拟头尾节点快速实现双向链表
  • 计算Transformer的Flops
  • 从 0 到 1 打造社区产品:短说社区助力开启社交新篇
  • Java编程中的设计模式:单例模式的深度剖析
  • 深度解析 Caffeine:高性能 Java 缓存库
  • LED-Merging: 无需训练的模型合并框架,兼顾LLM安全和性能!!
  • iOS App 上架步骤解析:适合资源有限团队的上架流程与注意事项
  • 【Verilog】Verilator的TestBench该用C++还是SystemC
  • OpenSSL 混合加密
  • 16.数据聚合
  • C++的前世今生-C++11
  • 进入python虚拟环境的方法
  • hive集群优化和治理常见的问题答案
  • 「ECG信号处理——(18)基于时空特征的心率变异性分析」2025年6月23日
  • 实时反欺诈:基于 Spring Boot 与 Flink 构建信用卡风控系统
  • 2025.06.23【甲基化】methylKit:甲基化测序数据分析安装与详细使用教程
  • 鸿蒙容器组件 Row 全解析:水平布局技术与多端适配指南
  • 《Effective Python》第十章 健壮性——善用 try/except/else/finally,写出更健壮的 Python 异常处理代码
  • 个人作品网站模板/注册教育培训机构需要什么条件
  • 南宁住房和城乡建设委员会网站/seo综合查询平台官网
  • 有哪些做网站好的公司/经典网络营销案例
  • 虎门专业网站建设/关键词优化seo多少钱一年
  • 长沙电子商务网站建设/网络平台怎么推广
  • 苏州高端网站设计建设/seo优化的技巧