题目如下:

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)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. PAT 1051 Pop Sequence (25 分)

    返回 1051 Pop Sequence (25 分)   Given a stack which can keep M numbers at most. Push N numbers in the ...

  4. 【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 ...

  5. 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 ...

  6. 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 ...

  7. PAT (Advanced Level) 1051. Pop Sequence (25)

    简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...

  8. PAT甲题题解-1051. Pop Sequence (25)-堆栈

    将1~n压入最多为m元素的栈 给出k个出栈序列,问你是否能够实现. 能输出YES 否则NO 模拟一遍即可,水题. #include <iostream> #include <cstd ...

  9. 【PAT甲级】1051 Pop Sequence (25 分)(栈的模拟)

    题意: 输入三个正整数M,N,K(<=1000),分别代表栈的容量,序列长度和输入序列的组数.接着输入K组出栈序列,输出是否可能以该序列的顺序出栈.数字1~N按照顺序随机入栈(入栈时机随机,未知 ...

随机推荐

  1. rasa_core:基于机器学习的对话引擎

    用机器学习管理你的对话,让它提升每一个对话.Rasa Core引导对话,考虑对话的历史和外部环境. 而不是成千上万的规则,Rasa 从真正的对话中挑选模式. 现在是扔掉你的状态机的时候了! Manag ...

  2. 记录一次widora sdk编译ipk 实战编译redis

      因为业务需求,需要用到redis存储一点简单的数据,因为redis有良好的哈希机制,可以完美实现我的某些需求,但openwrt官方提供memcached的ipk并没有提供redis,没办法,只能自 ...

  3. String,StringBuilder,StringBuffer三者的区别

    参考   String,StringBuilder,StringBuffer三者的区别 这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 1.运行速度 首先说运行速度,或者说是执行速 ...

  4. Image中的alt

    如果图片不存在,默认会显示一个缺失图片,这是不友好的 所以可以加上alt属性. 当图片存在的时候,alt是不会显示的 当图片不存在的时候,alt就会出现 <img src="http: ...

  5. Gradle--初识

    1.Eclipse从svn导入Gradle项目 1.检出项目的时候不要选新项目,选"做为工作空间中的项目检出",然后点Finish. 2.将项目转为Gradle项目,右键导入的项目 ...

  6. 解决$.ajax()在IE10以下失效的问题

    一.问题重现 本地的脚本请求测试环境的接口 $.ajax({ url: ***, type: GET, data: data, success: function (data) { **** } }) ...

  7. Python Selenium 之数据驱动测试

    数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...

  8. CentOS7 YUM 安装NGINX

    1.先添加源: nano /etc/yum.repos.d/nginx.repo 把下边这段代码添加到nginx.repo中去.[nginx] name=nginx repo baseurl=http ...

  9. MySQL 字符串连接CONCAT()函数

    MySQL字符串连接函数 使用方法:CONCAT(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串, ...

  10. Docker配置 DNS

    Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢? 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件. 在容器中使用 mount 命令可以看到挂载信 ...