pat 1051

来源:互联网 发布:极客学院php就业班视频 编辑:程序博客网 时间:2024/05/01 01:24

a[i] = 0 未进stack
a[i] = 1 已在stack
a[i] = 2 已出stack
正确的两种情况
1.若s.top == sequence[i] pop之
2.若s.top != sequence[i] 将小于sequence[i]的且未在stack内,也未出stack的push进去,并且s.size < capacity

#include<stdio.h>#include<stack>using namespace std;bool CheckStack(int sequence[], int n, int capacity){    int *a = new int[n + 1];    int i,j;    for (i = 1; i <= n; i++)        a[i] = 0;    stack<int> s;    int flag;    for (i = 0; i < n; i++){        flag = 0;        if (s.size() == 0){            for (j = 1; j <= sequence[i]; j++)                if (!a[j]){                    a[j] = 1;                    s.push(j);                }            if (s.size() > capacity)                break;        }        if (s.top() == sequence[i]){                s.pop();                a[sequence[i]] = 2;                flag = 1;        }        else if (s.top() != sequence[i] && a[sequence[i]] == 0){                for (j = 1; j <= sequence[i]; j++)                    if (!a[j]){                        a[j] = 1;                        s.push(j);                }                if (s.size() > capacity)                    break;                s.pop();                a[sequence[i]] = 2;                flag = 1;        }        if (!flag)            break;    }    if (i == n)        return true;    else return false;}int main(){    freopen("1.in", "r", stdin);    int n, times, capacity;    scanf("%d%d%d", &capacity, &n, &times);    int *a = new int[n];    int i;    while (times--){        for (i = 0; i < n; i++)            scanf("%d", &a[i]);        bool flag = CheckStack(a, n, capacity);        if (flag)            printf("YES\n");        else printf("NO\n");    }    return 0;}
0 0
原创粉丝点击