通过判定当前出栈的元素及其之前未出栈元素的个数和是否大于栈长度,
以及当前出栈元素是否已在先前出栈来判定是否正确。
#include <stdlib.h>
#include <stdio.h>
#include <stack>
/*
Created by HarvestWu on 2018/04/27.
*/
/*
通过判定当前出栈的元素及其之前未出栈元素的个数和是否大于栈长度
以及当前出栈元素是否已在先前出栈过来判定是否正确
*/
using namespace std;
int main()
{
stack<int>stk;
int l, n, t;
int a,p,flag1,s[1002];
scanf("%d%d%d", &l, &n, &t);
while (t--)
{
int flag[1002] = { 0 };
int cflag;
p = 1;flag1 = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &s[i]);
}
for (int i = 1; i <= n; i++)
{
cflag = 0;//默认栈内没有当前要出栈的元素
a = s[i];
if (p<=a)
{
for (int j = p; j <= a; j++)//将当前元素及与前一个出栈的元素之间的元素入栈
if (!flag[j])
{
flag[j] = 1;//设标志已入栈过的元素
stk.push(j);
}
}
p = a;
if (stk.size()>l)//超过栈大小
{
printf("NO\n");
flag1 = 1;
break;
}
while (stk.size())
{
if (stk.top() >= a) //当前出栈的元素及其之前的元素出栈
{
if (stk.top()==a)//设置标志栈里有当前出栈的元素
cflag = 1;
stk.pop();
}
else break;
}
if (!cflag)//如果栈里没有当前出栈元素 则输出NO
{
printf("NO\n");
flag1 = 1;
break;
}
}
if (!flag1)
printf("YES\n");
while (!stk.empty())//清空栈、下次使用
stk.pop();
}
return 0;
}