题目如下:

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. 笔记10 在XML中声明切面(1)

    1.无注解的Audience package XMLconcert; public class Audience { public void silenceCellPhones() { System. ...

  2. Unique-paths (动态规划)

    题目描述 A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below) ...

  3. 关于thymeleaf th:replace th:include th:insert 的区别

    关于thymeleaf th:replace th:include th:insert 的区别    th:insert   :保留自己的主标签,保留th:fragment的主标签.    th:re ...

  4. TypeScript知识点

    TypeScript介绍 TypeScript为JavaScript的超集(ECMAScript6), 这个语言添加了基于类的面向对象编程.TypeScript作为JavaScript很大的一个语法糖 ...

  5. PHP MySQL Where 子句

    WHERE 子句 WHERE 子句用于提取满足指定标准的的记录. 语法 SELECT column_name(s) FROM table_name WHERE column_name operator ...

  6. 状态模式、职责链模式——省去if-else的繁琐结构

    小时候写日记都是这么写的:上午七点起床,八点之前洗脸刷牙吃早饭,十二点之前好好上课,中午一点,吃午饭,下午两点到六点,上课,下课,找请假,明天妈妈要带我去姥姥家,九点之前,看动画片,九点钟,收拾去姥姥 ...

  7. Angular2的input和output(原先的properties和events)

    angular2学习笔记 本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 文章来源:http://blog.ng-book.com/angular-2 ...

  8. 六星经典CSAPP-笔记(12)并发编程(上)

    六星经典CSAPP-笔记(12)并发编程(上) 1.并发(Concurrency) 我们经常在不知不觉间就说到或使用并发,但从未深入思考并发.我们经常能"遇见"并发,因为并发不仅仅 ...

  9. C实战:强大的程序调试工具GDB

    C实战:强大的程序调试工具GDB 1.基本调试 这里只列举最最常用的GDB命令. 1.1 启动GDB gdb program:准备调试程序.也可以直接进入gdb,再通过file命令加载. 1.2 添加 ...

  10. VirtualBox: Resize a Fedora, CentOS, or Windows Dynamic Guest Virtual Disk (VDI) in VirtualBox

    Here's the scenario: you've set up Dynamically Allocated Storage for the hard drive on your Guest VM ...