题目大意
题目以1,2,3,,,n的顺序入栈,问你出栈的顺序合不合法。
思路分析
怀疑自己题解看多了,现在独立思考的能力越来越差,基础的数据结构使用都很不自信,照这样下去机考要凉啊/(ㄒoㄒ)/~~
输入数组记为 ,其实就是将1-N依次入栈,使用两个指针 分别记录当前到了数 入栈,要判断的是 ,如果栈顶元素和 相等,说明对上了, ,如果不相等,这时候我们还有元素没有入栈,那就继续入栈,希望后面有元素 ,如果已经没有元素了,显然拼凑不到这种出栈形式。
#include<iostream>
#include<stack>
#include<algorithm>
#include<string.h>
#include<string>
using namespace std;
#define MAX 1005
#define ll long long
int main() {
ll N, a[MAX];
while (cin >> N && N) {
ll sign = 1;
while (sign) {
stack<ll> s;
for (int i = 0; i < N; i++) {
cin >> a[i];
if (a[i] == 0) { sign = 0; break; }
}
if (sign) {
ll i = 1, j = 0; s.push(i);//i从1-N入栈,看出栈顺序是否可以是a
while (j < N) {
if (!s.empty() && s.top() == a[j]) {//栈顶元素刚好等于原序列的第i个元素
j++; s.pop();
}
else if (i < N) {
s.push(++i);//不相等就加入剩余元素
}
else {//栈顶不匹配,而且没有剩余元素
break;
}
}
if (j == N)cout << "Yes" << endl;
else cout << "No" << endl;
}
}
cout << endl;
}
}