出栈序列的合法性

简介: STL函数库栈的使用

给定一个最大容量为 M 的堆栈,将 N 个数字按 1, 2, 3, ..., N 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?例如给定 M=5、N=7,则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 },但不可能得到{ 3, 2, 1, 7, 5, 6, 4 }。

输入格式:
输入第一行给出 3 个不超过 1000 的正整数:M(堆栈最大容量)、N(入栈元素个数)、K(待检查的出栈序列个数)。最后 K 行,每行给出 N 个数字的出栈序列。所有同行数字以空格间隔。

输出格式:
对每一行出栈序列,如果其的确是有可能得到的合法序列,就在一行中输出YES,否则输出NO。

输入样例:
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
输出样例:
YES
NO
NO
YES
NO
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

#include <iostream>
#include <algorithm>
#include <stack>
#include <cstring>
using namespace std;

const int N=1010;

int n, m, k;
int a[N];
bool st[N];

int main()
{
    scanf("%d %d %d", &n, &m, &k);
    while(k--)
    {
        for(int i=0;i<N;i++)
            st[i]=false;
        stack<int> t1, t3;
        for(int i=m;i>0;i--)
            t1.push(i);
        for(int i=0;i<m;i++)
            scanf("%d", &a[i]);
        int flag=0;
        for(int i=0;i<m;i++)
        {
            if(st[a[i]])
            {
                if(a[i]!=t3.top())
                {
                    puts("NO");
                    flag=1;
                    break;
                }
                else
                    t3.pop();
            }
            else
            {
                while(a[i]!=t1.top())
                {
                    t3.push(t1.top());
                    st[t1.top()]=true;
                    t1.pop();
                }
                if(a[i]==t1.top())
                    t3.push(a[i]);
                if(t3.size()>n)
                {
                    puts("NO");
                    flag=1;
                    break;
                }
                else
                {
                    t3.pop();
                    t1.pop();
                }
            }
        }
        if(!flag)
            puts("YES");
    }
    return 0;
}
相关文章
|
16天前
|
存储 Java 容器
深入浅出 栈和队列(附加循环队列、双端队列)
深入浅出 栈和队列(附加循环队列、双端队列)
|
10天前
|
存储 缓存 算法
【数据结构】栈和队列的模拟实现(两个方式实现)
【数据结构】栈和队列的模拟实现(两个方式实现)
|
2天前
|
存储 算法 调度
数据结构与算法-栈篇
数据结构与算法-栈篇
10 3
|
2天前
数据结构初阶 栈
数据结构初阶 栈
7 1
|
7天前
|
算法
数据结构和算法学习记录——栈和队列作业(实现链栈上的进栈、实现链栈上的退栈、实现链队上的入队列)
数据结构和算法学习记录——栈和队列作业(实现链栈上的进栈、实现链栈上的退栈、实现链队上的入队列)
10 0
|
7天前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
14 2
|
7天前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
13 0
|
7天前
|
算法 C语言
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
9 0
|
7天前
|
算法
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
4 0
|
7天前
|
存储 机器学习/深度学习 算法
数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)
数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)
6 0