题目大意:给你栈的容量M和k个长度为n的序列,问你将1,2,…,n依次入栈,这k个序列所代表的出栈顺序是否可行。
我一开始觉得可行序列可能遵循某种规律,但是找了半天没有发现。看了题解之后才惊觉模拟就可以解决。TvT
在将n个元素依次入栈的过程中,判断当前要入栈的元素是否与需要判断的出栈序列里的元素相同,如果相同的话就依次出栈。
栈满,或者最后栈中仍有元素则输出“NO”,否则就是“YES”
【我实在是个很差的讲题人TvT 这个模拟感觉挺裸的,不知道该咋个描述】
#include <cstdio>
#include <iostream>
#include <stack>
using namespace std;
int ps[1005];
stack<int> s;
int main()
{
int M, N, K;
scanf("%d %d %d", &M, &N, &K);
while (K--)
{
for (int i = 0; i < N; i++)
{
scanf("%d", &ps[i]);
}
int cnt = 0;
bool flag = true;
for (int i = 1; i <= N; i++)
{
if (s.size() == M)
{
flag = false;
break;
}
s.push(i);
while (!s.empty() && s.top() == ps[cnt])
{
cnt++;
s.pop();
}
}
if (flag == true && s.empty())
{
printf("YES\n");
}
else
{
printf("NO\n");
}
while (!s.empty())
{
s.pop();
}
}
return 0;
}
需要注意的是在取top和pop的时候判断栈非空,每组测试之间将栈清空。