模拟入栈出栈
r
//有一个栈,大小为M,有N个数字,数字1~N只能按顺序依次入栈。
//给出K个出栈序列,判断该序列是否是可以实现的出栈序列。
//入栈顺序是确定的(1-N依次入栈),我们只需要模拟这个过程。
//先把输入的序列接收进数组seq[],
//设index= 1,表示当前比较的是序列哪个元素,
//然后按顺序1~n把数字进栈,每进入一个数字,判断有没有超过栈容量m,
//超过了就break。
//如果没超过,看看当前序列元素seq[index]是否与栈顶元素s.top()相等:
//while相等就一直弹出栈s.pop(),index++,相当于当前序列元素匹配成功,继续处理下一个;
//不相等就继续按顺序把数字压入栈。
//若能完美模拟,最终栈应该是空的,说明这个序列是可能的,输出YES
#include <stack>
#include <iostream>
using namespace std;
int maxn, n, q;
//vector<int>v;
int main() {
cin >> maxn >> n >> q;
int num[n] = { 0 };
stack<int>s;
while (q--) {
for (int i = 1; i <= n; i++) {//存储每行可能的出栈顺序
scanf("%d", &num[i]);
}
while (!s.empty()) {//只要stack栈内不为空,有元素,则弹出元素
s.pop();
}
int cur = 1;
bool flag = true;
for (int i = 1; i <= n; i++) {//入栈顺序唯一:1,2,3,4,5,6...n
s.push(i);
if (s.size() > maxn) {
flag = false;
break;
}
while (!s.empty()&&num[cur]==s.top()) {
s.pop();
cur++;
}
}
if (flag == true && s.empty() == true)
cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
---------------------------------
#include <cstdio>
#include <stack>
#include <iostream>
using namespace std;
const int N = 1010;
stack<int> st;
int num[N] = { 0 };//存放需要入栈元素的数组
int main() {
int m, n, q;//栈的容量大小,需要入栈的元素的个数,需要询问可能出栈的顺序的个数
cin >> m >> n >> q;
for (int i = 0; i < q; i++) {
while (!st.empty()) {
st.pop();
}
for (int i = 1; i <= n; i++) {
cin >> num[i];//num[1]=1、num[2]=2......num[5]=5
}
int cur = 1;
bool flag = true;
for (int i = 1; i <= n; i++) {//入栈到栈顶元素和第?个出栈元素一样,就出栈
st.push(i);
if (st.size() > m) {
flag = false;//满了满了,别插了
break;
}
while (!st.empty() && st.top() == num[cur]) {
st.pop();
cur++;
}
}
if(st.empty()==true&&flag==true)
cout << "YES\n";
else cout << "NO\n";
}
return 0;
}