数据结构习题——有效的括号(栈),栈与队列和互相实现,循环队列的实现

在这里插入图片描述

文章目录

  • 前言
  • 1、有效的括号
    • 题目
    • 思路
    • 代码
  • 2、用队列实现栈
    • 题目
    • 思路
    • 代码
  • 3、用栈实现对列
    • 题目
    • 思路
    • 代码
  • 4、设计循环队列
    • 4.1循环队列的概念和了解
    • 题目
    • 思路
    • 代码
  • 总结

前言

继上篇博客学习了栈与队列之后,今天我们来尝试着使用他们来写一些题目,话不多说,启动启动启动

1、有效的括号

习题链接:有效的括号

题目

在这里插入图片描述

思路

本题给定一个字符串,然后要在指定的条件下判断字符串是否有效
简而言之就是括号要对应起来且类型相同,不多不少刚刚好
想到昨天学习的栈,先进后出的规则,可以用到这里
遇到左括号入栈,遇到右括号就和栈顶元素匹配
如果最后栈内还有元素或者遍历字符串途中遇到括号不匹配直接返回false

代码

class Solution 
{
public:bool isValid(string s) {char stack[10000];    //  定义一个字符数组,简易代表栈   int top = -1;for(int i = 0; s[i] !='\0'; ++i)    //  循环遍历字符串{char cur = s[i];if(cur == '(' || cur == '[' || cur == '{')    //  遇到左括号就入栈  {stack[++top] = cur;}else{if(top == -1)    //  如果遇到右括号   栈内无元素  ,直接返回false  {return false;}char topcur = stack[top--];       //  取栈顶元素  if((topcur == '(' && cur != ')') || (topcur == '[' && cur != ']') || (topcur == '{' && cur != '}'))return false;    //   列出不匹配的情况  }}return top == -1;}
};

在这里插入图片描述

在上一篇的栈的具体学习过后,这个题目相对而言还是简单的,就是对栈的特殊结构的使用

2、用队列实现栈

习题链接:用队列实现栈

题目

在这里插入图片描述
在这里插入图片描述

思路

本题是仅且使用两个队列去实现一个先进后出的栈
要知道我们的队列是符合先进先出的特殊规则,要怎么才能实现栈呢?
我想到栈分为入栈和出栈还有取栈顶元素三个功能,我用一个队列来实现入栈,另外一个队列来实现出栈

上图
在这里插入图片描述
在这里插入图片描述
图片解析下,思路清晰明了
入栈就插入不为空的队列,出栈就把队列元素移动到空队列,只留下一个数据出队列就好了,取栈顶元素直接取不为空队列队尾元素即可。两个队列反复横跳。

小编这里还有另外一种思路,因为今天想偷一点小懒,使用stl库中的队列,这样就不用自己手写一个队列了。
一个队列作为主要队列,一个队列作为辅助队列,每次入栈插入辅助队列,然后把主要队列的元素一一插入辅助队列,这个时候,队头元素就是刚刚插入的数据,出栈就直接出队头元素即可,取队头元素也是一样的道理。

代码

class MyStack 
{
public:queue<int> q1;    //   本题偷了一点小懒   使用了stl库中的队列  它拥有昨天实现的队列的所有功能queue<int> q2;    //   q1为主要队列   q2为辅助队列  MyStack() {}void push(int x)    //  入栈  {q2.push(x);     // 将元素先push到  q2中   while(!q1.empty())     // q1不为空    {  q2.push(q1.front());      //  把q1队内的元素放入q2  q1.pop();				//  放入之后  q1 pop  }swap(q1,q2);    //  这个时候q1 是为空的  交换q1  q2  这个时候q1 的队头就是刚刚插入的数据   }int pop() {int x = q1.front();   //  出栈操作   q1.pop();return x;}int top()     //  取栈顶元素   {return q1.front();}bool empty() {return q1.empty();    }
};

每次插入都对队列进行一顿操作,相当于是给队列反过来变成栈了。
也是稳稳拿下了。
在这里插入图片描述

3、用栈实现对列

习题链接:用栈实现队列

题目

在这里插入图片描述

思路

有了上一题用队列实现栈的操作,想必也能想到用栈实现队列也大相径庭,就是用两个栈去把一个栈的特殊结构改变一下
也是构造两个栈,一个主要栈,一个辅助栈,每次入队就直接入辅助栈,等要出队列时,如果主要栈为空就把辅助栈的元素全部出栈,然后入到主要栈,这样元素顺序就颠倒了,也就是主要栈出栈就变成了出队。

代码

class MyQueue 
{
public:stack<int> s1;   //  构造主要栈和辅助栈  stack<int> s2;   MyQueue() {}  void push(int x) {s1.push(x);   //  每次数据入队  入辅助栈  }int pop()    //  当要出队时  {if(s2.empty())   //  若此时主要栈为空  也就是意味着主要栈的元素已经全部出队了  {while(!s1.empty())   //   这个时候把辅助栈的元素出栈再入主要栈  主要栈的出栈顺序就是队列的出队顺序了  {s2.push(s1.top());s1.pop();}}int ans = s2.top();   //   如果主要栈还不为空   直接出栈即可  s2.pop();return ans;}int peek()    //   获取队头元素   {int ans = this->pop();   //  可以直接出队列  保存元素  再入栈  s2.push(ans);return ans;}bool empty() {return s1.empty()&&s2.empty();   //  当连个栈都为空时  队列也为空  }
};

当对栈和队列的特性理解的深刻一点的时候,栈和队列的相互实现想想也是挺简单的,拿下拿下
在这里插入图片描述

4、设计循环队列

4.1循环队列的概念和了解

循环队列,环形队列⾸尾相连成环,环形队列可以使⽤数组实现,也可以使⽤循环链表实现

在这里插入图片描述

队列满的情况下,为什么 Q.rear 不存储数据?
为了能使⽤ Q.rear = Q.front 来区别是队空还是队满,我们常常认为出现上图b时的情况即为队满的情况
此时: rear+1=front

在这里插入图片描述
在这里插入图片描述
在用数组实现循环队列时,需要注意一点的是:当队列空间需要n个时,数组需要开n+1个容量
为什么呢?如果我现在只是按照队列的元素开指定个数组的空间 想想当队列为空的条件是什么 应该是 front == rear 吧 那当队列为满的情况呢 是不是也是 front == rear 这个时候就冲突了 ,不知道队列什么时候是空什么时候是满
所以我们这里是用数组的时候,开辟队列指定元素个数 n + 1个 。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述图片数组开辟了 n+1和空间,这个时候队列为空和队列满的情况就不冲突了。需要注意的是在判断队列满的情况需要
(rear+1)%(capacity+1) ==front 我来解释一下 :数组此时容量是n+1,所以有一个空间是不储存数据的,也就是rear,当rear的下一个元素为front时,队列为满,这里%上容量大小是因为怕rear+1越界。

至于用链表实现循环队列,就是单向带头循环链表,相信大家已经滚瓜烂熟了,接下来,上题


习题链接:设计循环队列

题目

在这里插入图片描述

思路

本题就是设计一个循环队列,刚才已经带着大家把循环队列的概念已经了解透彻啦。
这里小编在写题就直接用c++啦,stl容器用起来还是很方便的,不要怕看不懂,我的注释是很详细的
话不多说,上代码

代码

class MyCircularQueue 
{
public:int front,rear,capacity;vector<int> arr;    //  这里类似于顺序表  开辟一个数组  arrMyCircularQueue(int k) {capacity = k + 1;     //  定义capacity  为k + 1arr.assign(capacity,0);   //   这里类似于  给数组初始化全部为  0front = rear = 0;    //  然后  front  和   rear   都从数组下标0 开始 }    bool isFull()     //  判断循环队列是否为满   {return (rear + 1) % capacity == front;   //  前面已经详细解释过啦   }bool enQueue(int value)     //  向循环队列插入元素   插入成功返回真  {if(isFull())    //  先判断队列是否为满   {return false;}arr[rear] = value;    //   不满就在  rear位置   插入数据即可  rear = (rear + 1) % capacity;   //  rear位置插入后  需要往后移动一步  这里还是要取模防止数组越界  return true;}bool isEmpty()    //  判断循环队列是否为空   {return front == rear;    //  直接返回判断条件    }bool deQueue()       //  向循环队列中删除一个元素   {if(isEmpty())    return false;front = (front + 1) % capacity;   //  如果队列不为空,直接让 front  往前走一步就好了   return true;}int Front()      //  获取队首元素    {if(isEmpty())    return -1;return arr[front];    //   队列不为空就直接返回   front位置对应的元素       }int Rear()     //  获取队尾元素   {if(isEmpty())return -1;return arr[(rear - 1 + capacity) % capacity];  //  因为rear位置是空缺不存储数据的 //   所以要返回rear的前一个数据同时要防止数组越界的情况   }
};

到这里,循环队列的实现就结束啦,不出意外,还是拿下了。
在这里插入图片描述

总结

通过今天的习题,对栈和队列的理解更加深刻,同时也能熟练运用栈和队列,去互相实现还是挺有意思的
同时在写题的过程中不止对知识的掌握更加深刻,也让我学习到了新的知识——循环队列,还是挺有意思的。
好啦,栈和队列的内容就到这里啦,下一篇博客小编将为大家讲述新的知识
另外,有什么写的不好的或者不详细的还请大家指出来,谢谢大家

最后的最后,感谢大家能看到这里,我也是平平无奇的一枚在慢慢学习中的小趴菜,分享自己的学习经历,同时也能复习自己所学的知识。 小编持续跟新中…

芷兰生于深林,不以无人而不芳
每一行代码都是迈向更好的牛奶和面包的一步,加油加油加油

在这里插入图片描述

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

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

相关文章

常用命令之LinuxOracleHivePython

1. 用户改密 passwd app_adm chage -l app_adm passwd -x 90 app_adm -> 执行操作后&#xff0c;app_adm用户的密码时间改为90天有效期--查看该euser用户过期信息使用chage命令 --chage的参数包括 ---m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 ---M 密码…

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…

鸿蒙学习生态应用开发能力全景图-赋能套件(1)

文章目录 赋能套件鸿蒙生态应用开发能力全景图 赋能套件 鸿蒙生态白皮书: 全面阐释了鸿蒙生态下应用开发核心理念、关键能力以及创新体验,旨在帮助开发者快速、准确、全面的了解鸿蒙开发套件给开发者提供的能力全景和未来的愿景。 视频课程: 基于真实的开发场景,提供向导式…

贴代码框架PasteForm特性介绍之select,selects,lselect和reload

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

人工智能技术的应用前景与我们的应对策略

​ 大家好&#xff0c;我是程序员小羊&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在社会生活、产业转型以及科技进步中发挥着日益重要的作用。AI正逐步改变着我们的生活和工作方式&#xff0c;同时也带来了技术和伦理上的诸多挑战。本文…

Unreal engine5实现类似鬼泣5维吉尔二段跳

系列文章目录 文章目录 系列文章目录前言一、实现思路二、具体使用蓝图状态机蓝图接口三、中间遇到的问题 前言 先看下使用Unreal engine5实现二段跳的效果 一、实现思路 在Unreal Engine 5 (UE5) 中使用蓝图系统实现类似于《鬼泣5》中维吉尔的二段跳效果&#xff0c;可以通…

Python Excel XLS或XLSX转PDF详解:七大实用转换设置

目录 使用工具 Python将Excel文件转换为PDF Python将Excel文件转换为带页码的PDF Python将Excel文件转换为特定页面尺寸的PDF Python将Excel文件转换为PDF并将内容适应到一页 Python将Excel文件转换为PDF/A Python将Excel文件中的工作表转换为单独的PDF Python将Excel工…

Linux网络——网络初识

目录 1. 认识协议 2. 协议的分层 3. OSI 七层模型 && TCP/IP 五层(四层)模型 4. 网络传输的基本流程 5. 以太网的通信原理 6. 数据的跨网络传播 7. 认识 IP 地址 ① IP 是什么 ② IP 与 MAC 的关系 ③ 为什么需要 IP 在谈及网络之前&#xff0c;我们要先对学…

RedHat7—Linux中kickstart自动安装脚本制作

本实验使用虚拟机版本为rhel7&#xff0c;从rhel7后的版本kickstart工具进行收费使用。 1.在VMware关闭dhcp自动获取ip地址功能 2.安装并启动httpd [rootlocalhost ~]# yum install httpd [rootlocalhost ~]# systemctl start httpd [rootlocalhost ~]#systemctl stop firewal…

基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言&#xff0c;通过收集了5种常见的垃圾数据集&#xff08;‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’&#xff09;&#xff0c;然后基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对图像数据集进…

OMV7 树莓派 tf卡安装

​ 升级7之后&#xff0c;问题多多&#xff0c;不是docker不行了&#xff0c;就是代理不好使 今天又重装了一遍&#xff0c;用官方的链接&#xff0c;重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

前端无感刷新token

摘要&#xff1a; Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌&#xff08;access token&#xff09;的技术&#xff0c;确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项&#xff1a; 访问…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器&#xff08;IWDG_KR&#xff09; 2.预分频寄存器&#xff08;IWDG_PR&#xff09; 3.重载寄存器&…

RHCE的练习(12)

写一个脚本&#xff0c;完成以下要求&#xff1a; 给定一个用户&#xff1a; 如果其UID为0&#xff0c;就显示此为管理员&#xff1b;否则&#xff0c;就显示其为普通用户&#xff1b; #!/bin/bash ​ # 使用read命令获取用户名 read -p "请输入用户名: " username ​…

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出&#xff08;IO&#xff09;操作的讨论。主要分为两类&#xff1a; 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源&#xff0c;例如音乐、音效、美术资源&#xff08;如 3D 模型和…

探索 HTML 和 CSS 实现的 3D旋转相册

效果演示 这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果&#xff0c;每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画&#xff0c;实现了一个动态的旋转展示效果 HTML <div class"wrapper"><div class"inner" style"-…

什么是Hadoop

Hadoop 介绍 Hadoop 是由 Apache 开发的开源框架&#xff0c;用于处理分布式环境中的海量数据。Hadoop 使用 Java 编写&#xff0c;通过简单的编程模型允许在集群中进行大规模数据集的存储和计算。它具备高可靠性、容错性和扩展性。 分布式存储&#xff1a;Hadoop 支持跨集群…

逆向攻防世界CTF系列39-debug

逆向攻防世界CTF系列39-debug 查了资料说.NET要用其它调试器&#xff0c;下载了ILSPY和dnSPY ILSPY比较适合静态分析代码最好了&#xff0c;函数名虽然可能乱码不显示&#xff0c;但是单击函数名还是能跟踪的&#xff0c;而dnSPY在动态调试上效果好&#xff0c;它的函数名不仅…

华为开源自研AI框架昇思MindSpore应用案例:人体关键点检测模型Lite-HRNet

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 一、环境准备 1.进入ModelArts官网 云平台帮助用户快速创建和部署模型&#xff0c;管理全周期AI工作流&#xff0c;选择下面的云平台以开始使用昇思MindSpore&#xff0c;获取安装命令&#xff0c;安装MindSpo…

Cellebrite VS IOS18Rebooting

Cellebrite VS IOS18Rebooting我们想分享一些有关 iOS 18 重启“功能”的信息。在过去一周左右的时间里&#xff0c;人们对 iOS 18 中一项新的未记录功能产生了极大关注&#xff0c;该功能会导致设备在一段时间不活动后重新启动。 这意味着&#xff0c;如果设备在一定时间不活…