题目链接: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;elsecout << "No" << endl;}cout << endl;}return 0;
}