PAT Pop Sequence
02-3. Pop Sequence (25)
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.
Input Specification:
Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.
Output Specification:
For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.
Sample Input:
5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2
Sample Output:
YES
NO
NO
YES
NO
题目大意: 有一个大小为M的栈和一个大小为N的以1为首的升序序列,判断能否利用这个栈将该数组的顺序变成与输入数组相同的顺序,输入的数据有K组。例如:如果M = 5,N = 7,我们可以利用栈得到1,2,3,4,5,6,7,但是不能得到3,2,1,7,5,6,4。如果能得到输入的序列,则输出YES,否则输出NO。 思路: 可以将栈想做中转站,若想使序列从A到B,必须经过有限大的C,如图所示:
如果A[i]和B[j]相等并且C没有满,则判断A的下一位和B的下一位,如果A[i]和B[j]不相等并且C未满,则将A[i]囤积到C,直到C的最上面元素与B[j]相等,取出C的top,如此循环。
#include <cstdio>
#include <stack>
using namespace std;
const int maxn = 1000;
int main()
{
int m, n, k;
int arr[maxn];
scanf("%d%d%d", &m, &n, &k);
for(int i = 0; i < k; i++)
{
int A = 1, B = 0;
int ok = 1;
stack<int> s;
for(int j = 0; j < n; j++)
{
scanf("%d", &arr[j]);
}
while(B < n)
{
if(A == arr[B] && s.size() < m)
{
A++;
B++;
}
else if(!s.empty() && s.top() == arr[B])
{
s.pop();
B++;
}
else if(A <= n && s.size() < m)
{
s.push(A);
A++;
}
else
{
ok = 0;
break;
}
}
printf("%sn", ok ? "YES" : "NO");
}
return 0;
}</span>
- MOTS攻击之TCP攻击
- iOS学习——获取当前最顶层的ViewController
- 中国深圳一家厂商的智能摄像头曝出漏洞:至少 17.5 万设备可被远程攻击
- iOS学习——Xcode9上传项目到GitHub
- 手把手教你编写一个简单的PHP模块形态的后门
- 如何将简单的Shell转换成为完全交互式的TTY
- 如何使用HackRF做一个简单的IMSI捕获器
- 联想Z470黑化之路:硬件升级还能刷苹果Mac系统!
- 渗透测试TIPS之删除、伪造Linux系统登录日志
- 1分钟懂awk-技不在深,够用就行
- RChain节点通信机制
- Spark源码系列(一)spark-submit提交作业过程
- Android安全几道入门题目
- 挖洞经验 | 看我如何通过子域名接管绕过Uber单点登录认证机制
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法