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

【LeetCode数据结构】栈和队列的应用

🔥个人主页:胡萝卜3.0

🎬作者简介:C++研发方向学习者

📖个人专栏:  《C语言》、《数据结构》 、《C++干货分享》、LeetCode&牛客代码强化刷题

⭐️人生格言:不试试怎么知道自己行不行

目录

一、有效的括号

二、用队列来实现栈

三、用栈来实现队列

四、选择题


一、有效的括号

20. 有效的括号 - 力扣(LeetCode)

题目描述

思路:借助数据结构——栈,遍历字符串,遇到左括号就入栈;遇到右括号就取栈顶元素,看是否匹配,如果成功匹配栈顶元素就出栈,继续遍历字符串;如果不匹配,就直接返回false。

我们根据上面的思路就可以写出相应的代码:

上面的代码看似是正确的,其实还是有些错误的,有些特殊情况没有考虑到。

当第一个字符就是右括号时,该怎么办?当字符串中只有一个左括号时,该怎么办?

当第一个字符就是右括号时,我们执行的取栈顶元素的操作,但是此时栈中并没有元素,栈为空栈,所以我们需要判断栈是否为空,如果栈为空,直接返回false。

当字符串中只有一个左括号时,当遍历结束时,栈不为空,所以当结束遍历时,需要判断栈是否为空,如果为空,返回true;如果不为空,返回false。

代码

bool isValid(char* s) {ST ps;StInit(&ps);STDataType* pi=s;//遍历字符串,遇到左括号,就让其入栈,遇到右括号,让栈顶元素出栈,看是否匹配while(*pi!='\0'){//遇到左括号就入栈if((*pi=='(')||(*pi=='[')||(*pi=='{')){StPush(&ps,*pi);}//遇到右括号就取栈顶元素else{if(StEmpty(&ps)){StDestory(&ps);return false;}STDataType top=StTop(&ps);if(((*pi==')')&&(top!='(')) || ((*pi==']')&&(top!='[')) || ((*pi=='}')&&(top!='{'))){StDestory(&ps);return false;}else{//栈顶元素出栈StPop(&ps);}}pi++;}if(StEmpty(&ps)){StDestory(&ps);return true;}else{StDestory(&ps);return false;}
}

二、用队列来实现栈

225. 用队列实现栈 - 力扣(LeetCode)

题目描述

思路:
入栈:往不为空的队列中入数据

出栈:将不为空的队列中前size-1个数据依次入为空的队列中,最后一个数据直接出队

取栈顶元素:找不为空的队列,直接返回该队列的队尾数据

将上面思路转换成代码:

typedef struct {Queue q1;Queue q2;
} MyStack;//向操作系统申请栈的空间
MyStack* myStackCreate() {MyStack* st=(MyStack*)malloc(sizeof(MyStack));if(st==NULL){perror("malloc fail!");exit(1);}//队列的初始化QueueInit(&st->q1);QueueInit(&st->q2);return st;
}
//入栈
//往不为空的队列中入数据
void myStackPush(MyStack* obj, int x) {//找出空的队列if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1,x);}else{QueuePush(&obj->q2,x);}
}
//出栈
//把不为空的队列中的前size-1个数据挪到另一个队列中,再将最后一个数据出队列
int myStackPop(MyStack* obj) {//找出空的队列Queue* empty=&obj->q1;Queue* nonempty=&obj->q2;if(!QueueEmpty(empty)){nonempty=&obj->q1;empty=&obj->q2;}int size=QueueSize(nonempty);QDataType top=0;while(size-->1){//取队头top=QueueFront(nonempty);//将队头数据往空的队列中入QueuePush(empty,top);//出队头QueuePop(nonempty);}top=QueueFront(nonempty);QueuePop(nonempty);return top;
}
//取栈顶
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) {QueueDestory(&obj->q1);QueueDestory(&obj->q2);free(obj);obj=NULL;
}

队列相关代码看:

数据结构初阶:详解栈和队列(下)——队列-CSDN博客

三、用栈来实现队列

232. 用栈实现队列 - 力扣(LeetCode)

题目描述

思路:
入队:往pushst中入数据

出队:如果popst为空,将pushst(不为空)中的数据先倒过去再出数据

取队头数据:逻辑和出队的差不多,如果popst为空,将pushst(不为空)中的数据先倒过去,但是不出数据,最后再取队头

将上面思路转换成代码:

//队列的结构
typedef struct {ST pushst;ST popst;
} MyQueue;
//向系统申请一个队列空间
MyQueue* myQueueCreate() {MyQueue* q=(MyQueue*)malloc(sizeof(MyQueue));if(q==NULL){perror("malloc fail!");exit(1);}StInit(&q->pushst);StInit(&q->popst);return q;
}
//入队
//往pushst中入数据
void myQueuePush(MyQueue* obj, int x) {StPush(&obj->pushst,x);
}
//出队
//如果popst为空,将pushst(不为空)中的数据全部挪到popst中,然后出栈
int myQueuePop(MyQueue* obj) {if(StEmpty(&obj->popst)){while(!StEmpty(&obj->pushst)){STDataType top=StTop(&obj->pushst);StPush(&obj->popst,top);StPop(&obj->pushst);   }} STDataType top=StTop(&obj->popst);StPop(&obj->popst);return top;
}
//返回队头数据
int myQueuePeek(MyQueue* obj) {if(StEmpty(&obj->popst)){while(!StEmpty(&obj->pushst)){STDataType top=StTop(&obj->pushst);StPush(&obj->popst,top);StPop(&obj->pushst);   }} STDataType top=StTop(&obj->popst);return top;
}
//判断队列是否为空
bool myQueueEmpty(MyQueue* obj) {return StEmpty(&obj->pushst)&&StEmpty(&obj->popst);
}
//销毁队列
void myQueueFree(MyQueue* obj) {StDestory(&obj->pushst);StDestory(&obj->popst);free(obj);obj=NULL;
}

栈相关代码看:LeetCode&牛客代码强化刷题

四、选择题

一个栈的入栈序列为ABCDE,则不可能的出栈序列为( D)

A.ABCDE

B.EDCBA

C.DCEBA

D.ECDBA

栈满足后进先出的原则,D选项中E是第一个出栈的,那就说明E是最后一个进栈的,如果E是最后一个进栈,那么出栈的序列应为EDCBA

后续还会有更多题目,敬请期待!!!


文章转载自:

http://Ugm8dj7V.Lskrg.cn
http://7Dzf86XI.Lskrg.cn
http://U8mkPEvB.Lskrg.cn
http://rPbC9vNX.Lskrg.cn
http://iu3eOfS2.Lskrg.cn
http://nkoDhaDi.Lskrg.cn
http://6qo8T8OM.Lskrg.cn
http://DRs679gI.Lskrg.cn
http://SRCfea5o.Lskrg.cn
http://DcsQqjV6.Lskrg.cn
http://N232Lqem.Lskrg.cn
http://6M5lwFMt.Lskrg.cn
http://Tpvx9fVW.Lskrg.cn
http://EeBCThnI.Lskrg.cn
http://odLNvoyb.Lskrg.cn
http://Ds3o5Xxw.Lskrg.cn
http://me7foz1a.Lskrg.cn
http://Z2BnnzdQ.Lskrg.cn
http://hKEqmPaN.Lskrg.cn
http://rDaqNXyw.Lskrg.cn
http://riNt2QcK.Lskrg.cn
http://hHadiMXJ.Lskrg.cn
http://jTno0ILa.Lskrg.cn
http://oNrhTaHf.Lskrg.cn
http://PokhfYwZ.Lskrg.cn
http://WyQLdCyJ.Lskrg.cn
http://f7K6EYVQ.Lskrg.cn
http://fpOwQjxM.Lskrg.cn
http://IyxAxln8.Lskrg.cn
http://lRQEWEx6.Lskrg.cn
http://www.dtcms.com/a/363633.html

相关文章:

  • 洛谷P3811 【模板】模意义下的乘法逆元
  • 硬件开发1-51单片机1
  • 嵌入式 - 硬件:51单片机
  • LeetCode算法日记 - Day 29: 重排链表、合并 K 个升序链表
  • HTML第三课:特殊元素
  • CICD实战(3) - 使用Arbess+GitLab+Hadess实现Java项目构建/上传制品库
  • 人工智能之数学基础:分布函数对随机变量的概率分布情况进行刻画
  • PromptHero-最受欢迎的AI提示词网站
  • TIOBE 8月编程语言榜深度解析:Python占比突破26%,Perl成最大黑马
  • 【3D打印】3D打印机首次使用心得
  • Git相关的命令
  • 力扣hot100:缺失的第一个正数(哈希思想)(41)
  • 领导层必看:Curtain e-locker为您轻松管理“文件外发“
  • MySQL 多表查询方法
  • day42-单片机
  • 基于3dtitle模型无法双面渲染问题
  • 友思特案例 | 食品行业视觉检测案例集锦(三)
  • 实验4-HTTP协议的运行过程
  • 失业落伍前端, 尝试了一个月 ai 协助编程的真实感受
  • Vscode + docker + qt 网络监听小工具
  • 25.9.2_CTF_reverse_TEA算法
  • 项目解析:技术实现与面试高频问题
  • 交叉熵损失函数
  • 一文读懂 Python 【循环语句】:从基础到实战,效率提升指南
  • 零构建的快感!dagger.js 与 React Hooks 实现对比,谁更优雅?
  • 餐饮、跑腿、零售多场景下的同城外卖系统源码扩展方案
  • 基于高德地图实现后端传来两点坐标计算两点距离并显示
  • JDK16安装步骤及下载(附小白详细教程)
  • 【Spring Cloud微服务】9.一站式掌握 Seata:架构设计与 AT、TCC、Saga、XA 模式选型指南
  • Javascript》》JS》》ES6》 Map、Set、WeakSet、WeakMap