题目
思路
维护三个集合:核心栈、数字队列、目标队列
详细思路见注释
题解 C++
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main() {
int stackSize, len, total;
cin >> stackSize >> len >> total;
for (int i = 0; i < total; i++) {
stack<int> ss;//核心栈
queue<int> in;//数字队列
queue<int> out;//目标队列
//输入数字队列
for (int i = 1; i <= len; i++) {
in.push(i);
}
//输入目标队列
for (int i = 0; i < len; i++) {
int t;
cin >> t;
out.push(t);
}
//模拟栈:判断目标序列是否成立
while (true) {
if (ss.size() > stackSize) {//核心栈溢出:失败
cout << "NO\n";
break;
}
else if (ss.size() == 0) {//核心栈为空,则从数字队列中取出一个放进去
ss.push(in.front());
in.pop();
}
if (ss.top() == out.front()) {//核心栈顶元素=目标队列头元素
ss.pop();//核心栈出栈
out.pop();//目标队列出队
}
else {//栈顶元素不等于目标元素
if (in.size() == 0) {//数字队列已空:失败
cout << "NO\n";
break;
}
ss.push(in.front());//核心栈入栈
in.pop();//数字序列出栈
}
if (out.size() == 0) {//目标队列为空: 成功
cout << "YES\n";
break;
}
}
}
system("pause");
}