题目链接:http://poj.org/problem?id=1363
题目大意:
A站有编号为1到N,N最大1000,的车厢,车厢进入中转station了就不能回到A,只能停在station内或者进入B站,问能不能按照给定的顺序排成那样的车厢号。
解题:
每次一个新车厢进入station前,检查栈内栈顶元素是否与B站没有匹配的车厢头是否相等(如果有,则弹栈,重复此步骤),没有匹配的直接入栈。最后栈为空则可以排成给定次序。
举个例子:(2,1,3,5,4)能不能排成这样
AC代码如下:
#include <stack>
#include <iostream>
#define N 1001
using namespace std;
int main()
{
int Barr[N], i = 0, j = 0, len;
while(cin >> len && len) //输入火车长度
{
while (1)
{
stack<int> station;
for(i = 0; i < len; ++i) //输入火车B站的车厢顺序
{
cin >> Barr[i];
if(Barr[0] == 0) //第一个车厢是0,结束
break;
}
if(Barr[0] == 0) //第一个车厢是0,结束
{
break;
}
for(i = 1, j = 0; i <= len; ++i) //对1-N的车厢进行操作
{
while(!station.empty() && station.top() == Barr[j]) //中转站(栈)不为空则,比较栈顶与B的车厢的号码
{
station.pop(); //相等的话,车厢出栈
j++; //可以比较下一个车厢号码了
}
station.push(i); //栈为空或者栈顶车厢号与要求的不等,则直接把A站的车压入栈内
}
while(!station.empty() && station.top() == Barr[j]) //当1-N都压栈完了,栈内还有车厢的话,顺次和栈顶比较
{
station.pop();
j++;
}
if(station.empty()) //最后栈内为空则,可以匹配要求的顺序
cout << "Yes" << endl;
else
cout << "No" << endl;
}
cout << endl;
}
return 0;
}