开始不知道为什么用完stack后不执行清空操作也能AC
,后来想想大概是因为前一组压进栈的元素留在栈底,而栈是后进先出,而当前组用例是重新对n个数中的一些数进行压栈操作,出栈也是针对当前用例组的数据,所以不会用到前一组残留在栈底的数据,但为了保险起见,最好还是要对栈清空操作,另外一个办法就是不在while循环外面定义栈s,而在while循环内部定义栈s,这样当一组用例执行结束,栈s就为空了。。。
#include
#include
#include
using namespace std;
int a[1001]; //存放要实现的目标序列,即输入的n个数
int main(void)
{
int i; //i为目标序列下标
int j, n; //j = 1,2,3...n,表示进站前顺序序列
stack
s;
while(scanf("%d", &n), n) //外零
{
while(scanf("%d", &a[1]), a[1]) //内零
{
for(i = 2; i <= n; i++)
{
scanf("%d", &a[i]);
}
i = j = 1;
while(i <= n)
{
if(j == a[i]) //假如此时顺序序列j与目标序列a[i]值相等,
{ //则直接跳过入栈、出栈(实际情况不会)进行下一个判断
j++;
i++;
}
else
{
if(!s.empty() && a[i] == s.top()) //假如此时顺序序列j与目标序列a[i]值不同并且栈不空,
{ //那么要看a[i]是否与栈顶元素相同,相同则出栈,
s.pop(); //如果不同,那么只能在j后面找,但不能超出n,
i++; //超出了n,则无法实现目标序列,直接跳出
}
else
{
if(j <= n)
s.push(j++);
else
break;
}
}
}
if(i == n + 1) //while正常退出,可以实现目标序列
printf("Yes\n");
else
printf("No\n");
while(!s.empty())
s.pop(); //不能实现目标序列时,栈内会有残存,要清零,为判断下一组目标序列做准备
}
printf("\n");
}
//system("pause");
}