02-线性结构4 Pop Sequence

来源:互联网 发布:mac 能用的刻录机 编辑:程序博客网 时间:2024/06/04 19:45

题意

有一个栈大小为M的栈,有一个数列1,2,3,…,n要入栈,你可以任意时候出栈,给你一个k个出栈的序列,判断是否可以由这个数列得到,如果可以输出YES,不能则输出NO。

解题思路

对于入栈出栈的队列我们可以知道两个关系:
(1)对于刚出栈的数x,1~x内未出栈的个数应该小于栈的大小M。
(2)对应刚出栈的数x,如果比前一个出栈的数y小,那么x~y之间的所有数应该全部出栈。
因此我们可以扫描序列,对序列进行上述判断,一旦其中之一不满足,则出栈顺序错误。

参考代码

#include <stdio.h>#include <string.h>using namespace std;#define MAXN 1000+5int a[MAXN];bool used[MAXN];int m,n,k;bool f(int x){    int cnt=0;    for (int i=1;i<=x;i++)        if (!used[i])            cnt++;    if (cnt>m) return false;    return true;}bool g(int x,int y){    for (int i=x+1;i<y;i++)        if (used[i]==false)            return false;    return true;}int main(){    scanf("%d%d%d",&m,&n,&k);    while (k--){        for (int i=0;i<n;i++) scanf("%d",&a[i]);        memset(used,false,sizeof(used));        int flag=0;        for (int i=0;i<n;i++){            if (f(a[i])==false){                printf("NO\n");                flag=1;                break;            }            if (i!=0 && a[i]<a[i-1] && g(a[i],a[i-1])==false){                printf("NO\n");                flag=1;                break;            }            used[a[i]]=true;        }        if (!flag) printf("YES\n");    }    return 0;}
0 0
原创粉丝点击