【数据结构】——栈和队列OJ

一、有效的括号

题目链接:

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

题目的要求很简单,就是要求我们判断其输入的括号字符串是否是有效的括号,那么我们要如何判断呢?

我们可以这样,我们遍历出传入的字符串,然后我们创建一个栈,然后如果这个字符是组左括号,那么我们就让其入栈,然后如果是右括号,那么我们就取栈顶的元素和这个右括号进行对比,如果匹配那么就出栈,不匹配的话那么就说明这个字符串不是有效的括号,然后继续进行比较,直到字符串遍历完,那么我们字符串遍历完后,是否就表示我们的这个括号是有效的呢?

并不是,我们还有一种情况,就是我们的字符串全是左括号,那么我们可以在最后进行判断栈,如果栈不为空,那么就说明我们的字符串是无效的括号,那么我们要是为全是右括号的情况呢?

那么我们都是右括号的话,那么我们再取栈顶元素这里就会造成越界访问了,所以我们再判断到其字符不是左边括号的时候,那么我们进入要其是右边括号的情况,那么我们要先判断栈内不为空才行。

那么我们可以将我们前面学习的栈的功能的代码复制到oj平台中,然后我们再写题目中的函数。

二、用队列实现栈

 题目链接:

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

上面的题目也很好理解,就是要我们使用两个队列来实现栈的功能,我们经过前面的学习都知道我们的队列是先进先出,栈是先进后出,队列是一端进,另外一端出,然后栈是只能从栈顶入栈和出栈。其他的两个是差不多的。那么我们改如何使用两个队列来实现栈的功能呢?我们主要是要想办法将我们入队列的数据可以反过来出队列,不过我们发现其不要求我们出栈要在一个队列,我们要两个队列进行配合。

例如我们现在要入1,2,3,4。四个数据,那么我们的入队列的顺序为1->2->3->4,我们现在希望其出队列的顺序为4->3->2->1,那么我们改如何实现呢?

我们可以这样,我们每次要出栈都是要出的入队列最晚的数据,那么我们可以这样,我们每次入栈,都将其先入到一个非空的队列中,然后我们要出栈的时候,那么我们就将从出队列那一端的前size-1个数据按照 入队列的顺序,将其转移到另外一个空队列,那么我们要出栈就对原来那个队列进行出栈,那么就可以实现我们的先进先出的功能了。

我们这里需要使用很多队列的功能,那么我们将我们前面完成的队列的功能的函数都复制到oj平台上。

首先我们要先创建两个队列,题目中提供了这个结构体,那么我们在这个结构体中创建两个队列成员即可。

然后我们要对我们的两个队列进行初初始化:

下面我们就要对数据进行入栈,我们提到了,我们入栈的话是将数据存储到非空的队列中,那么我们直接进行判断队列是否为空,不为空我们就调用我们的入队的函数即可。

然后就是我们的出栈了,我们出栈,实际上是出的非空队列的队尾的元素,那么我们就先将非空队列的队尾前面的元素移动到空队列中,然后再出队,那么就可以完成出栈了。

然后就到我们的取栈顶元素,其实就是我们当前不为空的队列的队尾的元素:

然后就是我们的判断当前栈是否为空:那么我们就判断两个队列即可,首先我们这个栈要为空的话,那么我们就需要两个队列都为空,那么我们就返回teur,那么就是我们的判队列为空的函数,当队列为空的时候能返回true,然后两个要都为空,所以我们使用一个与逻辑即可。

然后就剩下我们的销毁栈啦,那么我们直接调用我们销毁队列的函数,将两个队列进行销毁,然后再将这个栈结构也销毁即可。

 

三、用栈实现队列

题目链接:232. 用栈实现队列 - 力扣(LeetCode) 

上面我们是使用队列实现栈,现在这个题目就要求我们使用栈实现队列啦,那么我们要如何实现呢?

我们的栈是先进后出,队列是先进先出,那么我们此时就要两个栈进行配合,实现先进先出的功能,那么我们是否可以和上面队列实现栈一样呢?

基本的逻辑是一样,还是两个栈之间进行数据的倒,但是我们此时不是轮流进行倒了,我们是指定一个栈专门用来实现先进先出,那么具体是咋样呢?

我们先将数据入第一个栈,然后我们就保留栈底的元素,然后我们就从栈顶开始出栈到另外一个栈,然后第一个栈就只有栈底的元素了,那么此时再出栈,此时的数据就是这个队列出队的数据,然后我们第二个栈,此时的栈底是原来栈顶的元素,那么我们此时就要将第二个栈倒回去,然后再重新进行上面的操作吗?

其实不用,我们此时就可以直接对第二个栈进行出栈即可,因为此时我们的第二个栈的方向和一开始不同的了。

下面我们举个例子来理解:

比如我们入第一个栈的顺序为1->2->3->4,那么我们执行第一个操作后,我们的第二个栈从栈顶到栈底的顺序为2->3->4,那么我们此时就直接按照顺序进行出栈,那么就是我们的队列啦,那么我们的逻辑就是,我们判断第二个栈是否为空,如果不为空,那么我们就直接出栈,如果为空,那么我们就将专门用来入队的栈,出栈到第二个栈中。

下面我们来实现一下:

首先我们将我们前面学习的栈的代码进行拷贝复制一下,然后我们一步一步实现题目的要求。

我们题目第一个函数,要求实现队列的初始化,我们就在函数中创建一个队列,然后我们队列结构体是由两个栈组成的,然后我们对两个栈初始化即可,那么我们就调用我们的栈初始化函数即可。

下面就是我们的入队函数,我们就直接将数据入栈到pushST即可。

出队我们上面将到了:

下面就是我们的取队头元素,其实就将pushST栈的元素移动到popST栈中,那么此时的栈顶的元素就是队头的元素了。

下面为判断当前队列是否为空,如果队列为空那么就返回true,如果不为空就返回false。 

然后就是队列的销毁,那么我们就直接销毁栈,然后销毁这个队列即可:

四、循环队列 

题目链接:

622. 设计循环队列 - 力扣(LeetCode)

 循环队列是啥,题目已经讲的很清楚啦,那么我们该如何进行循环呢?

我们题目提到我们的循环队列是一种线性数据结构,那么我们就使用数组进行实现,那么我们创建一个循环队列结构体,其中包括,一个数组,一个记录我们队头的位置,一个记录我们的队尾,一个是我们的数组的有效容量。

然后我们数据的插入就从队尾的位置插入,数据的删除就从我们的对头进行删除,那么就实现了我们的先进先出。 

然后我们要如何判断当前队列是空,还是满的呢?

空的情况我们很容易想到,就是我们的front==rear的时候,那么我们的队列就为空的,那么满的情况呢?我们走一遍循环就知道,当我们的rear走完一遍循环后,我们要对其进行取队长的余数,然后raer就回到了0的位置,那么此时rear和front其实也还是相等的,那么咋办呢?

我们可以创建capacity+1个空间,那么我们的队列满的情况就是(rear+1)*(capacity+1)==front的时候就为队列满的情况。

判断是否为空:

判断是否满:

往循环队列中插入数据:

 删除循环队列的元素:

取队头元素:

取队尾元素,这里我们就要注意,就是我们的rear此时要是在我们的0的位置的时候,那么我们对其-1那么就变成-1了,那么就越界访问了,所以我们要特殊处理:

 销毁循环队列:

 那么整体代码如下:

 

运行结果:

 

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

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

相关文章

开源免费无广告专注PDF编辑、修复和管理工具 办公学术 救星工具

各位PDF处理小能手们!我跟你们说啊,今天要给大家介绍一款超牛的国产开源PDF处理工具,叫PDFPatcher,也叫PDF补丁丁。它就像一个PDF文档的超级修理工,专门解决PDF编辑、修复和管理的各种难题。 这软件的核心功能和特点&a…

【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析

本文深入剖析Android蓝牙协议栈中HID设备(BT-HD)服务的初始化与启用流程,从接口初始化、服务掩码管理、服务请求路由到属性回调通知,完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理,揭示服务启用的核心机制&…

2025年项目管理软件革命:中国技术主权与全球创新浪潮的交锋

全球项目管理软件市场正在经历一场由多重技术叠加引发的结构性变革。根据Gartner最新预测,到2025年项目管理工具市场规模将突破220亿美元,其中中国市场增速达38%,远超全球平均水平。这场变革不仅关乎工具功能迭代,更深刻影响着企业…

计算机组成与体系结构:组相联映射(Set-Associative Mapping)

目录 🧩 映射方式问题回顾 🏗️ 组相联映射 工作流程 地址结构 ♻️ 替换策略 示例: 优点 ⚖️ 与其他映射方式对比 🧩 映射方式问题回顾 直接映射的问题: 优点:实现简单,查找速度快…

机器学习第八讲:向量/矩阵 → 数据表格的数学表达,如Excel表格转数字阵列

机器学习第八讲:向量/矩阵 → 数据表格的数学表达,如Excel表格转数字阵列 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:…

基于Spring AI实现多轮对话系统架构设计

文章目录 基于Spring AI实现多轮对话系统架构设计 前言 一、多轮对话系统核心架构 1.1 架构概览 1.2 Spring AI核心优势 二、ChatClient与多轮对话设计 2.1 ChatClient的特性与角色 2.2 实现多轮对话方法 三、Advisors拦截器机制 3.1 Advisors概念与工作原理 3.2 对…

C++中的虚表和虚表指针的原理和示例

一、基本概念 1. 什么是虚函数(virtual function)? 虚函数是用 virtual 关键字修饰的成员函数,支持运行时多态(dynamic polymorphism)。通过基类指针或引用调用派生类重写的函数。 class Base { public:…

FPGA:XILINX FPGA产品线以及器件选型建议

本文将详细介绍Xilinx(现为AMD的一部分)当前的FPGA产品线及其主要特点,并提供器件选型的建议。以下内容基于Xilinx FPGA的最新信息,涵盖产品系列、特性及选型指导。由于Xilinx已被AMD收购,产品线以AMD Xilinx品牌为主&…

【C++】多线程和多进程

在C++中,多线程通信(同一进程内的线程间交互)和进程间通信(IPC,不同进程间的数据交换)是构建并发系统的核心技术。以下是两种通信机制的详细介绍和典型实现: 一、多线程通信(线程间同步与数据共享) 1. 共享内存与同步原语 通过全局变量或对象成员变量实现数据共享,…

PC Cleaner软件,它能帮助用户轻松清理和优化电脑,提升系统性能。

不用破解就能用!这款超神的电脑清理 Pro 版,绝了! 宝子们,我是你们的数码小助手蓝木云!不知道大家有没有这种感觉,电脑用久了,就像住久了没打扫的屋子,越来越 “乱”,运…

linux中fork()函数的小问题

问题描述&#xff1a;分析下列代码&#xff0c;分别能产生多少a // 1 for(int i0; i<3; i){ printf("a\n"); fork(); }// 2 for(int i0; i<3; i){ fork(); printf("a\n"); }// 3 for(int i0; i<3; i){ fork(); printf("a"); } fflus…

阿克曼-幻宇机器人系列教程2- 机器人交互实践(Topic)

在上一篇文章中&#xff0c;我们介绍了两种登录机器人的方式&#xff0c;接下来我们介绍登录机器人之后&#xff0c;我们如何通过topic操作命令实现与机器人的交互。 1. 启动 & 获取topic 在一个终端登录树莓派后&#xff0c;执行下列命令运行机器人 roslaunch huanyu_r…

51c嵌入式~电路~合集27

我自己的原文哦~ 一、7805应用电路 简介 如上图&#xff0c;7805 集成稳压电路。 7805是串联式三端稳压器&#xff0c;三个端口分别是电压输入端&#xff08;IN&#xff09;&#xff0c;地线&#xff08;GND&#xff09;&#xff0c;稳压输出&#xff08;OUT&#xff09;…

Vitrualbox完美显示系统界面(只需三步)

目录 1.使用vitrualbox的增强功能&#xff1a;​编辑 2.安装增强功能&#xff08;安装完后要重启虚拟机&#xff09;&#xff1a; 3. 调整界面尺寸&#xff08;如果一个选项不行的话&#xff0c;就多试试其他不同的百分比&#xff09;&#xff1a; 先看看原来的&#xff0c;…

2025年第十六届蓝桥杯软件赛省赛C/C++大学A组个人解题

文章目录 题目A题目C&#xff1a;抽奖题目D&#xff1a;红黑树题目E&#xff1a;黑客题目F&#xff1a;好串的数目 https://www.dotcpp.com/oj/train/1166/ 题目A 找到第2025个素数 #include <iostream> #include <vector> using namespace std; vector<i…

电机控制储备知识学习(一) 电机驱动的本质分析以及与磁相关的使用场景

目录 电机控制储备知识学习&#xff08;一&#xff09;一、电机驱动的本质分析以及与磁相关的使用场景1&#xff09;电机为什么能够旋转2&#xff09;电磁原理的学习重要性 二、电磁学理论知识1&#xff09;磁场基础知识2&#xff09;反电动势的公式推导 附学习参考网址欢迎大家…

JMeter同步定时器 模拟多用户并发访问场景

同步定时器 JMter同步定时器的作用主要在于模拟多用户并发访问的场景&#xff0c;确保多个线程能够同时执行某个操作&#xff0c;达到真正的并发效果。 当多个线程同时启动时&#xff0c;它们可能会在不同的时间间隔内执行&#xff0c;这样就无法达到真正的并发效果。&#xff…

C++11异步编程 --- async

C11异步编程 — async和future C11引入了async和future机制&#xff0c;用于简化异步编程和并发操作。这两个组件位于<future>头文件中&#xff0c;提供了高级的异步任务管理接口。 一、async 1.定义 std::async std::async是一个函数模板&#xff0c;用于启动一个异…

(七)深度学习---神经网络原理与实现

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.神经网络原理概述 二.神经网络的训练方法 三.基于Ker…

[Java实战]Spring Boot 整合 Swagger2 (十六)

[Java实战]Spring Boot 整合 Swagger2 &#xff08;十六&#xff09; 一、Swagger 的价值与痛点 为什么需要 API 文档工具&#xff1f; 开发阶段&#xff1a;前后端高效协作&#xff0c;实时验证接口测试阶段&#xff1a;提供标准化测试用例维护阶段&#xff1a;降低新人理解…