#include<iostream>
#include<stack>
#include<string>
using namespace std;
//这道题虽然考栈但是在逻辑方面可是巧妙
int main()
{
stack<int> s;
int n;
int B[1001];
while (cin >> n)
{
memset(B, 0, sizeof(B));//设置为0,因为每次循环都需要0开始
for (int i = 1; i <= n; i++)
{
cin >> B[i];//输入B的序列(出栈的顺序)
}
int a=1, b=1,flag=1;//a用来记录进栈的顺序,b用来记录B的下标
while (b<=n)//结束条件为b满了,也就是正常位置配对了。
{
if (a == B[b]) { a++; b++; }//这里很巧妙,因为一般人会想到用A[]来写,但是这里用的是a//如果他配对,则不用进栈直接到B就对了,然后各自加一
else if (!s.empty() && s.top() == B[b]) { s.pop(); b++; }//如果不想等,那么就需要取判断在他入栈之前是否栈顶和B[]配对,并且保证栈为空
else if (a <= n) { s.push(a); a++; }//如果a这个数小于n,就意味着a还没有处理完,那么久入栈
else { flag = 0; break; }//异常退出
}
if (flag)
{
cout << "YES"<<'\n';
}
else
{
cout << "NO" << '\n';
}
}
return 0;
}
05-16
05-16
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交