题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944
题解
题目要求
-
背景
给定一个最大容量为M的栈,随机压入和弹出N个数(从1到N)。请判断一个序列是否有可能是该栈弹出的序列
-
输入
- M:不超过1000,栈的最大容量
- N:不超过1000,输入序列的长度
- K:不超过1000,待检查的序列的数量
- K个序列
解题思路
模拟入栈和出栈的过程,参考了柳婼的题解。
从1到N入栈:每入栈一个数字,便判断是否出栈,如果可以出栈则出栈(重复此步骤)。如果入栈后,栈大小超过M,则跳出循环停止入栈,结果为NO;如果正确模拟了入栈和出栈,则结果为YES。
代码
// Problem: PAT Advanced 1051
// URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944
// Tags: 栈
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main()
{
int m, n, k;
scanf("%d%d%d", &m, &n, &k);
vector<int> v(n + 1);
while (k--){
for (int i = 1; i <= n; i++)
scanf("%d", &v[i]);
stack<int> s;
int current = 1;
for (int i = 1; i <= n; i++){
s.push(i);
if (s.size() > m)
break;
while (!s.empty() && s.top() == v[current]){
s.pop();
current++;
}
}
if (current == n + 1)
printf("YES
");
else
printf("NO
");
}
return 0;
}
参考链接
https://blog.csdn.net/liuchuo/article/details/52215337
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!