火车车厢进站出站问题。车厢以固定的1~n的顺序入站,每节车厢的入站出站都是独立的,但是进了站C就不能再回到A,出了站到B也就不能再回到站C里。给定一个出站的顺序,判断该顺序是否是可能的。
用栈来模拟车厢进出中转站C的过程,遍历出站顺序,检查每一个值能否通过合法操作获得。合法操作总共只有三种:
- 若当前出站顺序的值和入栈顺序的值相等,则可以直接入站再出站(即跳过该值);
- 若当前出站顺序的值和栈顶元素的值相等,则将栈顶元素弹出;
- 若上述两种条件都不满足,则只能将入站顺序的值压入栈中。
若上述三种合法操作都不能进行,则该顺序就是不可能出现的。
注意上述四个条件语句的顺序,不能随便调换,否则就会出错。
#include <iostream>
#include <stack>
using namespace std;
const int maxn = 1010;
int main() {
int N;
int order[maxn];
while (cin >> N && N) {
while (1) {
cin >> order[1];
if (order[1] == 0) break;
for (int i = 2; i <= N; i++) {
cin >> order[i];
}
int A = 1, B = 1;
stack<int> C;
int ok = true;
while (B <= N) {
if (order[B] == A) {
A++;
B++;
}
else if (!C.empty() && C.top() == order[B]) {
C.pop();
B++;
}
else if (A <= N) {
C.push(A);
A++;
}
else {
ok = false;
break;
}
}
if (ok) cout << "Yes" << endl;
else cout << "No" << endl;
}
cout << endl;
}
}