poj 1363 Rails
#include<iostream>
#include<stack>
using namespace std;
int n,target[1001],temp;
int main()
{
while(cin >> n&&n)
{
while(cin >> temp&&temp)
{
stack<int> s;
int A = 1,B = 1; //A是有顺序的车厢号,B是栈堆指针
target[1] = temp;
for(int i = 2;i <= n;++i)
{
cin >> target[i];//目标数组
}
int ok = 1;
while(B <= n)
{
if(A == target[B])//如果第一节车厢就与目标相同,满足条件
{
A++;
B++;
}
else if(!s.empty() && s.top() == target[B])//如果栈堆非空且栈顶与目标相同,满足条件
{
s.pop();//将栈顶元素丢弃
B++;//指针++
}
else if(A <= n)//如果上述两条件均不满足但车厢号仍然小于N,则将其放入栈堆中
s.push(A++);
else //上述条件无一成立,则不可能满足目标数组
{
ok = 0;
break;
}
}
if(ok)
cout << "Yes" <<endl;
else
cout << "No" <<endl;
}
cout << endl;
}
return 0;
}
//sample:初始进栈数列都是默认为 1,2,3,4,5,6...,通过序列 1 2 3 4 5... 进行栈操作,如果能转换成target数组,就是yes
//比如sample中第一个例子,初始进栈数列默认为 1,2,3,4,5
//分别输入两组target数组:(1)1 2 3 4 5 输出yes (2) 5 4 1 2 3 输出no 输入0,表示结束这一组测试数据