数据结构:栈与队列OJ题

目录

前言

一、用栈实现队列

 二、用队列实现栈

 三、括号匹配问题


前言

    前面讲了栈和队列的基础知识,今天来巩固一下加深理解,这里说明一下,因为现在都是在用C语言写,这些OJ题里都要用到前面实现栈和队列的代码,每道题我都会加上前面的链接方便查看。

一、用栈实现队列

    这里先给一下题目链接(用栈实现队列),同时这道题我们需要用到前面实现栈的代码,不清楚的可以看这里(数据结构:栈)。

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
bool empty() 如果队列为空,返回 true ;否则,返回 false

示例 1:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

    题目要求用两个栈实现队列,可以想一下,栈是先进后出,队列先进先出,先创建两个栈,数据进队列时放入一个栈中,出队列时就把一个栈中数据再按相反的顺序放进另一个栈中,要出队列的那个数据就成了栈顶,实现了用两个栈模拟出队列,其他操作类似。

    下面放代码(代码片段后都有解释),这里就不放栈的实现的代码了,可以去前面的章节看,链接我前面放了。

typedef struct {Stack z1;Stack z2;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* s=(MyQueue*)malloc(sizeof(MyQueue));StackInit(&s->z1);StackInit(&s->z2);return s;
}

创建两个栈,用到了前面栈的初始化。

bool myQueueEmpty(MyQueue* obj) 
{return StackEmpty(&obj->z1)&&StackEmpty(&obj->z2);
}

 两个栈都为空那么这个队列就是空的。

void myQueuePush(MyQueue* obj, int x) {if(!StackEmpty(&obj->z1)){StackPush(&obj->z1,x);}else{StackPush(&obj->z2,x);}
}int myQueuePop(MyQueue* obj) {Stack* empty = &obj->z1;
Stack* noempty = &obj->z2;
if (!StackEmpty(&obj->z1))
{empty = &obj->z2;noempty = &obj->z1;
}
while (!StackEmpty(noempty))
{StackPush(empty, StackTop(noempty));StackPop(noempty);
}
int a = StackTop(empty);
StackPop(empty);
while (!StackEmpty(empty))
{StackPush(noempty, StackTop(empty));StackPop(empty);
}
return a;
}

    模拟进队列就像前面说的,除了第一次数据入栈,后面都是找一个有数据的栈入栈,出队列先要分清有数据的栈和空栈,把数据按相反的顺序入到空栈中,再删除栈顶元素。 

int myQueuePeek(MyQueue* obj) {if(!StackEmpty(&obj->z1)){return obj->z1.a[0];}else{return obj->z2.a[0];}
}

    模拟返回队列开头元素,只要找到有数据的栈,返回栈底元素,因为我前面栈的实现是用数组写的,这里可以直接取栈底元素。

void myQueueFree(MyQueue* obj) {StackDestroy(&obj->z1);StackDestroy(&obj->z2);free(obj);
}

     模拟队列销毁,这个没什么好说的,把两个栈销毁就行。

 二、用队列实现栈

     和前面用栈实现队列类似,创建两个队列,模拟入栈时就是把数据放入一个队列中,出栈时就把一个队列的数据按相反的顺序放入另一个队列中,取队头数据模拟出栈,其他操作思路类似,其实就是围绕栈和队列的性质写。这里题目链接(用队列实现栈),还有实现队列的代码(数据结构:队列),可以自己去尝试一下,下面放代码就不解释了。

typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate()
{MyStack*s=(MyStack*)malloc(sizeof(MyStack));QueueInit(&s->q1);QueueInit(&s->q2);return s;
}void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q2)){QueuePush(&obj->q2,x);}else{QueuePush(&obj->q1,x);}
}int myStackPop(MyStack* obj) {Queue* empty=&(obj->q1);Queue* noempty=&(obj->q2);if(!QueueEmpty(&(obj->q1))){empty=&(obj->q2);noempty=&(obj->q1);}while(QueueSize(noempty)>1){QueuePush(empty,QueueFront(noempty));QueuePop(noempty);}int a=QueueFront(noempty);QueuePop(noempty);return a;
}int myStackTop(MyStack* obj) {if(QueueEmpty(&obj->q1)){return QueueBack(&obj->q2);}else{return QueueBack(&obj->q1);}
}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;
}

 三、括号匹配问题

    这里先给题目链接(有效的括号)

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false

这道题用栈写,可以用到栈的先进后出的性质,先上代码后面解释。

bool isValid(char* s) {Stack st;StackInit(&st);while(*s){if(*s=='('||*s=='{'||*s=='['){StackPush(&st,*s);}else{if(StackEmpty(&st))return false;char top=StackTop(&st);if(top=='('&&*s!=')'||top=='{'&&*s!='}'||top=='['&&*s!=']'){return false;}StackPop(&st);}s++;}if(StackEmpty(&st)){return true;}return false;
}

      先对字符串中的括号进行判断,如果是左括号就入栈,如果是右括号就开始匹配,匹配时入过栈中没有数据就说明没有左括号,那么就一定匹配失败,返回false,如果有数据,就开始判断左括号是否与之对应从而得出结果,不相同就返回false,相同就把栈中的这歌数据删除,继续下一对的判断,直到字符串没有后续字符了,注意:出循环后如果栈中还有数据,那也是匹配失败,说明没有与之对应的右括号。


     本篇内容就到这里了,每个题目都给了链接,还是要多练手,希望对各位有帮助。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394908.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别数据丢失烦恼,转转数据恢复和另外三款工具助你一臂之力!

不知道大伙儿有没有和我一样,到哪都喜欢拍照片和视频,加上办公上也是七七八八的各种格式的文件实在是多,所以电脑和手机等等设备上经常内存爆满需要清理,难免会出现不小心误删或者格式化、清空等等的情况,用过几款和转…

Journyx项目管理软件 soap_cgi.pyc XXE漏洞复现

0x01 产品简介 Journyx-Journyx成立于1996年,提供自托管项目管理解决方案ProjectXecute。主要功能包括资源跟踪、待办事项列表、任务分配以及与MS Project的集成。要运行ProjectXecute,需要Windows 2003或更高版本、IIS Web服务器和Intel处理器。也可以在Linux、Solaris、AI…

#子传父父传子props和emits #封装的table #vue3

#子传父&父传子props和emits #封装的table #vue3 父组件&#xff1a;emits defineEmits props 子组件&#xff1a; 子组件 <template><el-table v-bind"$attrs" ref"innerTableRef" v-loading"loading" border :data"tabl…

力扣刷题-轮转数组

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 首先&#xff0c;我们现在这里提供的是一种特别简单的思路&#xff0c;我们先来看一下这段代码&#xff1a; void rotate(int* nums, int numsSize, int k) {k%numsSize;int n…

git clone private repo

Create personal access token Clone repo $ git clone https://<user_name>:<personal_access_tokens>github.com/<user_name>/<repo_name>.git

5个适用于Linux系统的PDF转Word工具

凭借其跨平台和设备的统一标准、兼容性和规模小巧等主要优点&#xff0c;可携带文档格式&#xff08;PDF&#xff09;可谓最主流的文件格式之一。 市面上有许多查看PDF文件的强大工具&#xff0c;因此所有Linux系统的用户都可以根据自身喜好找到合适的PDF查看工具。然而&#x…

Linux从0到1——基础IO(上)【文件描述符/重定向/缓冲区】

Linux从0到1——基础IO&#xff08;上&#xff09; 1. 预备知识2. 复习一下常见的C语言文件接口3. 系统调用接口3.1 函数传参小技巧——标志位3.2 使用系统调用接口3.2.1 open3.2.2 write3.2.3 read 4. 文件描述符fd4.1 fd的本质4.2 理解struct file结构体4.3 fd的分配规则 5. …

BES(恒玄)平台log分析

前言 恒玄软件调试和分析基本是通过日志形式分析的&#xff0c;今天就详细说下日志组成和常用分析方法 1.日志组成解析 bes日志组成一般说由以下组成&#xff1a;tick时钟 模块log打印所在线程编码log内容 [17:31:22.834] 21786/NONE / 2 | CPU USAGE: busy18 light8…

WebStorm格式化JSON,将一行很长的JSON展开

webstorm json格式化插件将一行很长的json展开 在WebStorm中&#xff0c;要展开很长的JSON行&#xff0c;可以使用内置的JSON格式化功能。 打开WebStorm&#xff0c;并打开包含JSON的文件。 选择JSON文件中的任意部分。 按下快捷键 CtrlAltL (Windows/Linux) 或 CmdAltL (Ma…

GPT-4.o mini

https://share.xuzhugpt.cloud/ GPT-4.o mini 目前免费使用 把上面[chatgpt4o-mini-xuzhu]复制到UserToken的文本框中 点击[个人账户] 测试一下哈&#xff0c;看看&#xff1a; GPT-4.o代码有时候还是有严重错误&#xff1a;好奇怎么来的 上面是我写得&#xff0c;下面是GPT写…

01背包问题 c++

题目描述 有一个背包能装的重量maxw(正整数&#xff0c;0≤maxw≤20000)&#xff0c;同时有n件物品(0≤n≤100)(每件物品只有一件&#xff0c;要么拿&#xff0c;要么不拿)&#xff0c;每件物品有一个重量wi(正整数)和一个价值vi(正整数)。要求从这n件物品中任取若干件装入背包…

C++ 简单学习

C简单编译 auto关键字 auto 关键字用于自动类型推导。它允许编译器自动推断变量的类型&#xff0c;使得代码更加简洁和易于编写&#xff0c;尤其是在处理复杂类型或模板编程时。使用 auto 可以避免编写冗长的类型声明&#xff0c;同时减少由于类型不匹配导致的编译错误 auto x…

论文阅读报告: 在时间双向图上查询基于时间的的密集子图 | ICDE 2024

摘要 本文提出了一个新的模型&#xff08;α, β, T&#xff09;-core&#xff0c;用于在时间双向图上寻找凝聚子图。时间双向图中&#xff0c;不同实体之间的关系随着时间的推移而变化。为了提高查询效率&#xff0c;本文提出了顶点分区和时间分区的历史索引&#xff08;VH-I…

Java学习Day24:基础篇14:多线程

1.程序、进程和线程 程序 进程 进程(process)是程序的一次执行过程&#xff0c;或是一个正在执行的程序。是一个动态的过程&#xff1a;有它自身的产 生、存在和消亡的过程。 如&#xff1a; 运行中的QQ运行中的音乐播放器视频播放器等&#xff1b;程序是静态的&#xff0c…

【大模型从入门到精通13】openAI API 构建和评估大型语言模型(LLM)应用1

这里写目录标题 构建和评估大型语言模型&#xff08;LLM&#xff09;应用开发性能评估指标从开发到部署高风险应用LLM应用开发的最佳实践和建议从小处着手快速迭代自动化测试根据应用需求定制评估考虑伦理影响 构建和评估大型语言模型&#xff08;LLM&#xff09;应用 开发和部…

Sqli-labs-master靶场--布尔盲注

目录 1、布尔盲注 2、布尔盲注的流程&#xff08;以靶场less-8为例&#xff09; 2.1输入id尝试是否存在注入点 2.1.1通过以上尝试&#xff0c;联想到可能是布尔盲注 2.2猜测数据库长度 2.3获取数据库名 2.3.1python脚本获取 代码&#xff1a; 获取结果为&#xff1a; …

Hive SQL ——窗口函数源码阅读

前言 使用Starrocks引擎中的窗口函数 row_number() over( )对10亿的数据集进行去重操作&#xff0c;BE内存溢出问题频发&#xff08;忘记当时指定的BE内存上限是多少了.....&#xff09;&#xff0c;此时才意识到&#xff0c;开窗操作&#xff0c;如果使用 不当&#xff0c;反而…

1. js混淆-源码乱码

目录 调试干扰参数逆向 调试干扰 打开开发者工具&#xff0c;首先会进入 setInterval 生成的 debugger 将 uzt.js uyt.js 内容替换 将这两个文件的内容置空&#xff0c;并刷新页面就可以正常调试了 参数逆向 点击翻页&#xff0c;可以发现 https://match.yuanrenxue.cn/api…

Arduino导入实例程序的过程,实例包文件却编译显示缺失文件

参考中实例程序中的readme.txt 导入方式 下面是文档中的使用方式 1.基本信息&#xff1a; 本例程是基于Arduino进行开发的&#xff0c;例程均在E-Paper ESP8266 Driver Board上进行了验证;2.基本使用&#xff1a;方法1&#xff1a;将整个esp8266-waveshare-epd文件夹复制到C…

【Go】通过反射解析对象tag信息,实现简易ORM

反射是运行时&#xff0c;需要在运行时解析类型信息&#xff0c;编译期无法优化这些操作&#xff0c;因此比编译时已知类型信息的直接调用效率要低。 package mainimport ("fmt""reflect""strings" )type Person struct {Name string json:&quo…