本题单纯考栈的应用,直接使用STL的stack函数或者自己用数组模拟stack也可,这里我使用STL,题目大意讲,给定m,n,k三个数,m代表stack中最大能存数的个数,n代表给出的待测试序列的长度,m代表以下共有几个输入的序列,编程时,对于这种测试有很多行的数据,应该将其规模化简后逐一处理,这样就有了一种类似于流程化程序处理的感觉,会让思路清晰,这到题里我选择用一个while循环控制k个待测试序列输入,对于每一个k来说,用一个int数组存储输入待判断的序列,并选择用mark标记当前出栈顺序,对于这种出栈顺序的问题,我们用for循环控制变量i从1~n枚举,将当前i代表的数字入栈,并在for循环中用while判断当前入栈的栈顶元素是否与当前mark标记所代表的数组元素相同,如果相同,则让栈顶元素出栈,mark++,但是在这里有问题存在,如果此时栈空了,在使用top函数的时候程序会崩溃,(在stack中使用top或者pop函数的时候,一定要先判断栈是否非空,就算是在if或者是while的循环体中判断的时候也要先判断是否非空,在使用top等函数)所以,while函数里需要判断的还有当前栈是否非空,当然,因为题干有限制栈内元素的个数,所以,在每次push后,需要对当前栈内元素个数进行判断,一旦超出m,就直标记并接结束程序。当循环执行完成后,如果栈非空,那说明这是一个不合法的出栈序列,或者,因为我们使用mark标记数组的,只有当合法出栈序列出现的时候才会存在mark++,因此,如果for循环结束后,mark代表的数字不是n的话,也可以判断当前出栈序列存在问题,即应该输出NO
代码:
#include<iostream>
#include<stack>
using namespace std;
int main() {
int m, n, k;
cin >> m >> n >> k;
int arr[n];
while (k--) {
stack<int> st;
for (int i = 0; i < n; ++i)
cin >> arr[i];
int mark = 0, key = 0;
for (int i = 1; i <= n; ++i) {
st.push(i);
if (st.size() > m) {
key = 1;
break;
}
while (!st.empty() && st.top() == arr[mark]) {
st.pop();
mark++;
}
}
if (!st.empty())
key = 1;
if (key == 1) {
cout << "NO" << endl;
continue;
} else {
cout << "YES" << endl;
}
}
}