嗯,,,这题基本上就是判断是否合法出入栈
需要注意的是有几个变量记得要回归初始状态!!!!
比如中间那个中间站,如果没法按照B目标出来了话,要把中间那个栈清空,当中B目标栈全部都出去了,并且A栈全部进去就说明成功了就可以Yes;
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#define N 10000
using namespace std;
int main() {
int a, n = 1, ok = 1;
int Tag[N], i;
stack<int> s;
queue<int> ans; //用来记录答案
while (cin >> a && a)
{
while (cin >> Tag[1] && Tag[1]) {
for (i = 2;i <= a;i++) {
cin >> Tag[i];
}
ok = 1;
n = 1;
i = 1; //初始化
while (i <= a) { //i表示目标栈
if (s.empty())
{
if (n <= a) //n表示A栈
s.push(n++);//如果是空栈并且还有元素可以入栈
else
{ ok = 0;break;} //如果没元素可以入栈说明失败
}
else if (s.top() == Tag[i]) //如果栈顶和目标相当
{ //就出栈,目标指针上移
s.pop();
i++;
}
else if (n <= a) s.push(n++);//如果栈顶不相等 便入栈
else if (n > a) { ok = 0;break; } //栈顶不相等还没元素入栈
}
if (n >= (1 + a) && i == (1 + a)&&s.empty()) //如果目标出栈完并且入栈完
ans.push(1); //YES
else
ans.push(-1); //No
while (!s.empty())
s.pop();
}
if (!Tag[1]) ans.push(0);
}
while (!ans.empty())
{
if (1 == ans.front()) printf("Yes\n");
else if (-1 == ans.front()) printf("No\n");
else printf("\n");
ans.pop();
}
system("pause");
return 0;
}