1051. 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
题目要求判断一个长度为N的出栈序列是否可以用一个1~N的入栈序列和一个容量为M的堆栈完成。
乍一看题目似乎很难入手,但只要仔细思考一下,可以发现其中有很大的规律可循。
我们以3217564为例,一个容量为5的堆栈,因为入栈序列已经确定为1~7,按照下面的步骤思考:
我们设将要入栈的元素为push_index,要输出的元素为x:
x=3,push_index=1,还没有压到3,要输出三,必须一直压到3,然后弹出3,此时push_index=4(下一次要压入的是4),堆栈现在从底到顶分别为12。
接下来x=2,push_index=4,已经无法通过压入元素到达x,因此只有栈顶为x时才可能得到要求的输出序列,这时候判断栈顶是不是x,不是则这个序列无法实现,是则继续判断下一个x。
同样地,x=1也是这样处理,我们发现堆栈中有12,正好输出为21,因此可以正确输出321。
下面x=7,push_index=4,一直压入到x再弹出,则push_index=7,堆栈中在弹出7后为456。
下面x=5,push_index=7,这时候又要判断栈顶是不是5了,发现栈顶是6,已经不可能得到要求的输出序列。
通过这样举例,抽象如下:
①如果当前想要输出的元素x<将要入栈的元素push_index(由入栈序列得到,从1开始),则一直压入到x,然后弹出x,同时push_index指向下一个元素。
②如果当前想要输出的元素x==将要入栈的元素push_index,说明压入再弹出即可,这时候直接把push_index后移继续处理。
③如果当前想要输出的元素x>将要入栈的元素push_index,说明只能通过出栈方式得到x,看栈顶是否是x,是则弹出,继续处理;否则输出NO。
④只有③的条件始终满足,才输出YES。
代码如下:
#include <iostream>
#include <stack>
#include <vector>
#include <stdio.h> using namespace std; int main()
{
stack<int> nums;
int M,N,K;
int push_index = 1; // 压栈序列
int index = 1; // 遍历到的出栈序列位置
int x; // 要找的元素
bool right_flag = false;
cin >> M >> N >> K;
vector<int> pop_sequence(N);
for(int i = 0; i < K; i++){
for(int j = 0; j < N; j++){
cin >> pop_sequence[j];
}
push_index = 1;
index = 1;
while(!nums.empty()) nums.pop();
right_flag = true;
while(index < N){
x = pop_sequence[index - 1];
index++;
if(x < push_index){
if(!nums.empty() && nums.top() == x){
nums.pop();
}else{
right_flag = false;
break;
}
}else if(x == push_index){
push_index++;
}else{ // x < push_index,应该压入到index为止,弹出这个,再向后判断 if(push_index > N) {
right_flag = false;
break;
} for(; push_index <= x; push_index++){
nums.push(push_index);
if(nums.size() > M){
right_flag = false;
break;
}
}
nums.pop();
}
}
if(right_flag) cout << "YES" << endl;
else cout << "NO" << endl;
} return 0;
}
1051. Pop Sequence (25)的更多相关文章
- PAT 解题报告 1051. Pop Sequence (25)
1051. Pop Sequence (25) Given a stack which can keep M numbers at most. Push N numbers in the order ...
- PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)
1051 Pop Sequence (25 分) Given a stack which can keep M numbers at most. Push N numbers in the ord ...
- PAT 1051 Pop Sequence (25 分)
返回 1051 Pop Sequence (25 分) Given a stack which can keep M numbers at most. Push N numbers in the ...
- 【PAT】1051 Pop Sequence (25)(25 分)
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...
- PAT Advanced 1051 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 ...
- 1051 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 p ...
- PAT (Advanced Level) 1051. Pop Sequence (25)
简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...
- PAT甲题题解-1051. Pop Sequence (25)-堆栈
将1~n压入最多为m元素的栈 给出k个出栈序列,问你是否能够实现. 能输出YES 否则NO 模拟一遍即可,水题. #include <iostream> #include <cstd ...
- 【PAT甲级】1051 Pop Sequence (25 分)(栈的模拟)
题意: 输入三个正整数M,N,K(<=1000),分别代表栈的容量,序列长度和输入序列的组数.接着输入K组出栈序列,输出是否可能以该序列的顺序出栈.数字1~N按照顺序随机入栈(入栈时机随机,未知 ...
随机推荐
- c语言程序第2次作业
(一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 错误信息1:{{uploading-image-560144.png(uploading...)} 错误原因:stdio误写为stido 错 ...
- java反射 概念
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
- VMware在宿主上没有VMnet0、VMnet8,解决方法
一开始,坐着上机实验,一直搞不通为什么虚拟机上的客户机可以ping通自己的ip也可以ping通自己本身的ip,但是主机ping不通虚拟机的客户机,也ping不通虚拟机的网关. 尝试了各种问题,也追出了 ...
- java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法
/** *@author blovedr * 功能: java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法 * 日期: 2018年4月28日 16:20 * 注释: ...
- 转:Socket原理与编程基础
from: http://acm.tzc.edu.cn/acmhome/projectList.do?method=projectNewsDetail&nid=2 一.Socket简介 Soc ...
- Linux设置文件读写权限
设置文件夹的读写权限: sudo chmod -R 777 /data 权限码描述 sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读 ...
- Web API对application/json内容类型的CORS支持
假设有一简单架构分为前后两部分,其一是Angular构成的前端页面站点,另一个则是通过ASP.NET Web API搭建的后端服务站点.两个站点因为分别布署,所有会有CORS(Cross-Origin ...
- Zookeeper Api
如何使用 Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储 ...
- Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 元旦假期里,闲的无事,看到美团加载数据的动画,就突想写个Demo把动画知识集成一下.后来想了想,还是直接用一个Demo来把所有动画知识 ...
- 谈一谈CloudBlog的系统架构
---------------------------------------------------------------------------------------------[版权申明:本 ...