【洛谷 P4387】【深基15.习9】验证栈序列 题解(模拟+栈+队列)

2024-02-12 21:44

本文主要是介绍【洛谷 P4387】【深基15.习9】验证栈序列 题解(模拟+栈+队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【深基15.习9】验证栈序列

题目描述

给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n ( n ≤ 100000 ) n(n\le100000) n(n100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据。

输入格式

第一行一个整数 q q q,询问次数。

接下来 q q q 个询问,对于每个询问:

第一行一个整数 n n n 表示序列长度;

第二行 n n n 个整数表示入栈序列;

第三行 n n n 个整数表示出栈序列;

输出格式

对于每个询问输出答案。

样例 #1

样例输入 #1

2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3

样例输出 #1

Yes
No

思路

首先定义一个栈s1和两个队列pupo。其中,s1用于模拟栈操作,pu用于存储输入的原始序列,po用于存储目标序列。

在主函数main中,首先输入一个数q,表示接下来有q组数据需要处理。对于每一组数据,首先输入一个数n,表示序列的长度。然后清空栈和两个队列,以便处理新的一组数据。

接下来,输入n个数,这些数构成了原始序列,按照输入的顺序依次添加到队列pu中。再输入n个数,这些数构成了目标序列,按照输入的顺序依次添加到队列po中。

然后,开始模拟栈操作。对于原始序列中的每一个元素,都执行入栈操作,然后检查栈顶元素是否等于目标序列的第一个元素,如果相等,就同时执行出栈操作和删除目标序列的第一个元素。这个过程一直持续到原始序列中的所有元素都被处理完。

最后,如果栈为空,表示原始序列可以通过一系列的入栈和出栈操作得到目标序列,输出"Yes";否则,表示不能得到目标序列,输出"No"。


AC代码

#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#define AUTHOR "HEX9CF"
using namespace std;stack<int> s1;
queue<int> pu, po;int main() {int q;cin >> q;while (q--) {int n;cin >> n;while (s1.size()) {s1.pop();}while (pu.size()) {pu.pop();}while (po.size()) {po.pop();}for (int i = 1; i <= n; i++) {int t;cin >> t;pu.push(t);}for (int i = 1; i <= n; i++) {int t;cin >> t;po.push(t);}for (int i = 1; i <= n; i++) {s1.push(pu.front());pu.pop();while (s1.size() && s1.top() == po.front()) {po.pop();s1.pop();}}if (s1.empty()) {cout << "Yes" << endl;} else {cout << "No" << endl;}}return 0;
}

这篇关于【洛谷 P4387】【深基15.习9】验证栈序列 题解(模拟+栈+队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703683

相关文章

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2