题目大意:
有一个容量限制为M的栈,先把1,2,3…,n依次入栈,并给出一系列的出栈顺序,问这些出栈序列是否可能。
思路:
1.初始化栈,读入需要测试的出栈序列,以bool类型flag表示出栈序列是否合法。
2.入栈顺序1-N,1-N枚举i,对每一个i,先将i入栈,如果此时栈内元素大于m个,则违反规则,return,否则,反复判断当前待出栈元素current是否为栈顶元素,如果是,让该元素出栈,并让current自增指向下一个出栈元素。
3,如果上述操作结束后栈空,flag==true,则说明出栈顺序合法,输出YES 否则NO
AC代码:
//PAT_A 1051
#include<cstdio>
#include<stack>
#include<vector>
using namespace std;
int main() {
int m, n, k;//栈的最大容量,数字个数,查询次数
(void)scanf("%d %d %d", &m, &n, &k);
vector<int> arr(n + 1);//保存输入的序列
stack<int> st;
while (k--) {
while (!st.empty())st.pop();//清空栈
for (int i = 1; i <= n; i++) {
(void)scanf("%d", &arr[i]);
}
int current = 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() == arr[current]) {
st.pop();
current++;
}
}
if (st.empty() && flag == true)printf("YES\n");
else printf("NO\n");
}
return 0;
}