【刷题篇】栈和队列

news2024/11/19 16:45:55

目录

一.前言🌈

二.有效的括号✨

a.题目

b.题解分析

c.AC代码 

三. 用队列实现栈📏

a.题目

b.题解分析(辅助队列法)

c.AC代码(辅助队列法)

d.题解分析(就地存储法)

c.AC代码(就地存储法)

四. 用栈实现队列🍀

a.题目

b.题解分析

c.AC代码


一.前言🌈

        各位小友们好久不见,甚是想念!前段时间我们学习了两个重要的数据结构---栈和队列。那么我们的刷题篇也就该提上日程了,本期将带来三道与栈和队列有关的OJ题,它们分别是:

🚀本期的题目有: 有效的括号用队列实现栈用栈实现队列

注:为了实现方便,本期我们将使用C++来编写代码,利用STL中现有的栈和队列进行实现。

二.有效的括号✨

a.题目

b.题解分析

        我们知道,在我们编写的C程序中,会存在着小括号( )、中括号[ ]以及大括号{ },它们总是成对出现且匹配的,满足这个特点的一组括号我们就称它有效。例如{ ( ) [ ] }就是一组匹配的括号,而{ ( [ ) } ] 就不是一组匹配的括号。我们可以发现一个现象,从左往右开始第一个右括号 其前一个括号 必须是与之对应的左括号,否则这组括号就不匹配

        而如果本对括号匹配,我们就可以将本对括号移除,进行下一对括号的判断,直到所有括号都成功匹配,说明本组括号是有效的。如果在这个过程中出现一次不匹配,那就说明本组括号无效。 

有了以上思路,那究竟要选择什么合适的数据结构来存放我们的括号呢? 

我们自然而然的会想到,因为无论是判断是否匹配,移除匹配的括号,我们都只是在其中一端进行操作的。


    当我们的指针遇到左括号的时候,我们进行入栈操作。当遇到右括号时,我们就和栈顶的左括号进行比较,如果匹配,则pop出栈,移除匹配的括号;如果不匹配,则直接返回false。依次反复直到遍历完整个字符串。

  c.AC代码 

class Solution {
    //存放括号的栈
    stack<char> sta;
public:
	bool isValid(string s)
	{
        //遍历字符串
		for (int i = 0; i < s.size(); i++)
		{
			char c = s.at(i);
			switch (c)
			{
			case '(':
			case '[':
			case '{':
				sta.push(c);//左括号入栈
				break;
			case ')':
            case ']':
            case '}':
                if(sta.empty()) //括号栈为空,匹配失败
                {
                    return false;
                }
				if ((c==')' && sta.top() != '(')||
                    (c==']' && sta.top() != '[')||
                    (c=='}' && sta.top() != '{'))
				{
					return false; //匹配失败
				}
				else
				{
					sta.pop();//成功,将匹配成功的左括号出栈
				}
				break;
			default:
				//cout << "输入的字符串有误" << endl;
				return false;
				break;
			}
		}
        //遍历完毕,判断括号栈中还有没有剩余的括号
		if (sta.empty())//为空
		{
			return true;
		}
		else//不为空,说明左括号多了,匹配失败
		{
			return false;
		}
	}

};

三. 用队列实现栈📏

a.题目

b.题解分析(辅助队列法)

        本题要求我们用队列来模拟栈。由于队列的特性是先进先出,栈的特性是后进先出,因此我们需要模拟的栈的栈顶实际上是队尾,我们需要在队尾进行一系列操作。特别是出栈,要先将队列前面的元素全部出队后才能执行。

显然前面的元素我们不能直接无视,在它们出队的同时我们要将他们存放起来,以供下次使用。那么我们要怎样存储呢?这里有两个方案:辅助空间存储就地存储


我们先来看看辅助空间存储,我们可以再使用一个辅助的队列来存放队尾前面的元素,由于队列先进先出的特性,每个元素的顺序都将保持一致。当我们进行入栈时就入到不为空的队列进行出栈时将不为空的队列的前n-1个元素移到为空的队列中,然后将剩下的一个元素pop掉。动态演示如下:

c.AC代码(辅助队列法)

class MyStack {
    queue<int> q1;
    queue<int> q2;
public:
    MyStack() {

    }
    //入栈
    void push(int x) 
    {
        //从不为空的队列放入数据
        if (!q1.empty())
        {
            q1.push(x);
        }
        else
        {
            q2.push(x);
        }

    }
    //出栈
    int pop() 
    {
        if (q1.empty())
        {
            swap(q1, q2);
        }
        //将前几个元素转移到为空的队列中
        while (q1.size() > 1)
        {
            q2.push(q1.front());
            q1.pop();
        }
        int ret = q1.front();
        q1.pop(); //移除栈顶元素
        return ret;
    }
    //求栈顶元素
    int top() 
    {
        //栈顶所在位置即为队尾,直接访问即可
        if(!q1.empty())
        {
            return q1.back();
        }
        else
        {
            return q2.back();
        }
    }
    //判空
    bool empty() 
    {
        //两个队列都为空说明栈为空
        return q1.empty() && q2.empty();
    }
};

d.题解分析(就地存储法)

     上面我们采用了一个辅助队列来进行解题,实际上我们也可以只使用一个队列出栈的时候只需将前n-1个元素同时出队并再次入队,此时队头元素即为我们的栈顶元素,我们再将其pop,这样依然可以保证原有顺序不变。动态演示如下:

c.AC代码(就地存储法)

class MyStack {
    queue<int> q1;
public:
    MyStack() {

    }
    //入栈
    void push(int x) 
    {
        //放入数据,入队
        q1.push(x);
    }
    //出栈
    int pop() 
    {
        //记录当前共有几个元素
        int count=q1.size();
        //将前面count-1个元素出队并入队
        while(count > 1)
        {
            int val=q1.front();
            q1.pop();
            q1.push(val);
            count--;
        }

        //将此时的队头,即栈顶元素出队
        int ret=q1.front();
        q1.pop();
        return ret;
    }
    //求栈顶元素
    int top() 
    {
        //栈顶元素就是队尾元素
        return q1.back();
    }
    //判空
    bool empty() 
    {
        //队列为空说明栈为空
        return q1.empty();
    }
};

四. 用栈实现队列🍀

a.题目

b.题解分析

    本题和上一题基本上一样,区别就是我们这次模拟的是队列。由于队列是先进先出栈是后进先出,因此我们在模拟出队时依旧要将前n个元素先进行出栈。

 那么,我们要怎样将移除的前n-1个元素存放起来呢,可以就地存储吗?


答案是不行的。由于栈是先进先出,出栈和入栈是在同一端进行的,出栈的同时入栈相当于啥也没做。因此我们只能再使用一个栈进行辅助。

我们可以设计两个栈,一个栈存储入队的元素(input)另一个栈用于出队(output)。当进行入栈时,则往input入栈;当进行出栈时,如果ouput为空,则先将input中的元素压入output中,此时output的栈顶元素恰好就是队头元素,然后出栈即可,如果不为空,则直接出栈。动态演示如下:

c.AC代码

class MyQueue {
    stack<int> input;
    stack<int> output;
public:
    MyQueue() {

    }
    //入队
    void push(int x)
    {
        //往input入栈
        input.push(x);
    }
    //出队
    int pop()
    {
        //output为空,先将input数据移入
        if (output.empty())
        {
            while (!input.empty())
            {
                int val = input.top();
                input.pop();
                output.push(val);
            }
        }
        //此时output栈顶元素即为队头元素,出栈
        int ret = output.top();
        output.pop();
        return ret;
    }
    //求队头元素
    int peek()
    {
        //output为空,先将input数据移入
        if (output.empty())
        {
            while (!input.empty())
            {
                int val = input.top();
                input.pop();
                output.push(val);
            }
        }
        //栈顶元素即为队头元素
        int ret = output.top();
        return ret;
    }
    //判空
    bool empty()
    {
        //两个栈都为空说明队列为空
        return input.empty() && output.empty();
    }
};

以上,就是本期的全部内容啦🌸

制作不易,能否点个赞再走呢🙏

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

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

相关文章

全面带你了解AIGC的风口

前言 一、AIGC的介绍 二、AIGC 的几个主要作用 三、实现AIGC过程的步骤 四、科技新赛道AIGC开始火了 五、AIGC对世界产生广泛的影响 六、AIGC技术的主要风口 &#x1f618;一、AIGC的介绍 AIGC (AI Generated Content) 是指通过人工智能技术生成的各种类型的内容&#xff0c;…

SpringBoot学习3

一、JSR303数据验证 使用Validated进行数据验证&#xff0c;如果数据异常则会统一抛出异常&#xff0c;方便异常中心统一处理。 空检查 Null 对象为null NotNull 对象不能为 null&#xff0c;但可以是 空字符串(无法检验长度为0的字符串) NotBlank 检查约束字符串是不是为nul…

20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式

20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式 2023/4/3 15:50 最近向学习日语&#xff0c;找到日语发音的视频中&#xff0c;大多数是MP4格式&#xff0c;少量是WMV格式&#xff0c;PR2023貌似不能识别WMV格式。 于是&#xff1a;万能的ffmpeg上场了&…

使用GPT-4生成QT代码

一、概述最近ChatGPT火爆起来了&#xff0c;ChatGPT是一种基于GPT的自然语言处理模型&#xff0c;可以用于生成自然语言文本&#xff0c;例如对话、文章等。最近又发现了一个优秀且免费的代码生成工具Cursor &#xff0c;Cursor集成了 GPT-4 &#xff0c;可以帮助你快速编写、编…

动态规划:状态机DP和买卖股票问题【零神基础精讲】

买卖股票的最佳时机&#xff1a;无限次/冷冻期/k次【基础算法精讲 21】 来自0x3f&#xff1a;https://www.bilibili.com/video/BV1ho4y1W7QK/ 介绍了【买卖股票系列问题】与【状态机 DP】&#xff0c;包括【至多/恰好/至少】的讲解。 文章目录买卖股票问题和状态机DP(无限次)[1…

【CocosCreator入门】CocosCreator组件 | DragonBones(骨骼动画)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中DragonBones&#xff0c;它可以帮助您创建出色的2D骨骼动画。在本文中&#xff0c;我们将探讨CocosCreator引擎的DragonBones组件&#xff0c;以及如何使用它来创建精美的动画。 目录 …

VisualGC插件使用

下载安装VisualVM 下载地址&#xff1a;Visual VM mac系统选择macOS Application Bundle&#xff0c;下载完成后&#xff0c;双击dmg包安装即可&#xff0c;之后双击启动。 安装Visual GC 插件 点击菜单栏Tools&#xff0c;选择Pulgins&#xff0c;在第二个选项中找到Visua…

【CSS】更改用户界面样式 ③ ( 取消文本域拖拽 | 代码示例 )

文章目录一、取消文本域拖拽二、文本域拖拽示例三、取消文本域拖拽示例一、取消文本域拖拽 textarea 文本域 在 默认状态下是可以进行拖拽的 , 在网页布局中 , 一般不会允许这种情况发生 , 任意拖拽文本域会影响网页的整体布局 ; 设置文本域不可拖拽样式 : resize: none;文本…

windows编程(4) - GDI绘图基础

基础概念 GDI&#xff1a;Graphic Device Interface 图形设备接口。GUI&#xff1a;Graphic User Interface 图形用户接口。HDC&#xff1a;Handle of Device Context&#xff1a; 图形设备上下文句柄。 字符界面的基本单位是字符。 图形界面的基本单位是像素。 像素&#…

从数据展示中汉字缺失了解字符编码知识

有人在使用皕杰报表时遇到如下问题&#xff1a; 有些汉字变成了“&#xff1f;”&#xff0c;这是为什么呢&#xff1f;实际上就是你用的字符集里没有这个汉字导致的&#xff0c;要想搞懂这个问题&#xff0c;还得从字符、字符集、字符编码说起。 所谓字符&#xff0c;就是各…

定时任务练习----Linux 定时发送邮件 ( QQ 邮箱 为例)

邮件设置 &#xff1a; 在 QQ 邮箱的最上面 &#xff0c;点击设置。 在账户 这一栏&#xff0c;往下面走 找POP3 开头的栏目 在 POP3/SMTP 服务这一行&#xff0c;点击开启 &#xff08; 本身是 关闭状态 &#xff09; 关于 POP3 和 SMTP 服务需要做以说明 ; >>> 我…

技术管理笔记1

看点杂篇&#xff0c;整理下笔记&#xff1a; 目录&#xff1a; 1技术的本质 2 技术团队管理的本质 3 技术管理者的能力要求 4 技术管理者风格类型 5 实战案例分析&#xff1a; 一技术的本质 技术存在感低&#xff0c;缺乏话语权&#xff0c;以业务导向为主。 二 技术团…

Spring Cloud第二季--OpenFeign和Feign

文章目录一、Feign二、Feign和OpenFeign的区别三、案例测试1、eureka注册中心集群7001/70022、两个微服务3、OpenFeign一、Feign Spring Cloud Feign的介绍在Spring Cloud学习–声明式调用&#xff08;Feign&#xff09;中详细介绍。 简单回顾下&#xff0c;Feign是一个声明式…

UTF-8(Unicode Transformation Format)

文章目录一、Unicode示例代码&#xff1a;二、网络传输与Unicode三、UTF-8如何编码四、使用UTF-8转换传输Unicode五、利用Java-API进行UTF8编码和解码六、利用代码输出Unicode编码和UTF8编码七、手写UTF8编码、解码八、总结UTF8一、Unicode 示例代码&#xff1a; package demo…

【Ubuntu安装选项】

关于Ubuntu系统安装选项 [TOC](关于Ubuntu系统安装选项) 安装选项选择 一、*Try or Install Ubuntu 二、Ubunru (safe graphics) 三、OEM install &#xff08;for manufacturers&#xff09; 四、Test memory 总结 安装选项选择 在安装Ubuntu系统时会有四个选项&#xff0c;搜…

模型部署学习--有三AI(视频要收费So没学完)

视频地址&#xff1a;深度学习之模型部署 模型的整个使用流程 从模型训练到部署 一 部署平台选择&#xff1a; 1、在线服务器端部署&#xff0c;精度优先&#xff1a; 大模型/分布式&#xff08;如千亿级参数模型GPT-3&#xff09; 延迟不敏感&#xff08;如以图搜图应用&am…

chatgpt批量写作-chatgpt批量生成文章

cchatgpt写作 ChatGPT是一种基于Transformer架构的自然语言处理技术&#xff0c;它可以用于文本生成和对话场景&#xff0c;可以辅助写作、创作等任务。以下是一些使用ChatGPT进行写作的方法和技巧&#xff1a; Fine-tuning预训练模型&#xff1a;ChatGPT模型预训练时需要大量…

数字孪生卫星:概念、关键技术及应用

源自&#xff1a;软件定义世界 摘 要 在分析卫星产业发展趋势与升级转型新需求后&#xff0c;为推动卫星与新技术融合发展&#xff0c;提升大型卫星工程的整体管理水平与流程管控能力&#xff0c;促进卫星产业数字化、网络化、智能化、服务化转型升级&#xff0c;将数字孪生技…

百度天工AIoT设备应用使能平台助力企业低成本开发

数字中国建设的顶层文件《数字中国建设整体布局规划》&#xff08;以下简称《规划》&#xff09;于近日印发&#xff0c;作为数字中国建设的重要基础&#xff0c;《规划》指出&#xff0c;要全面赋能经济社会发展&#xff0c;推动数字技术和实体经济的深度融合&#xff0c;产业…

C++语法(15)---- 继承

C语法&#xff08;14&#xff09;---- 模板进阶_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130092939?spm1001.2014.3001.5501 目录 1.继承概念和定义 1.概念 2.定义 1.格式 2. 继承关系和访问限定符 2.基类和派生类对象赋值转换 3.…