[PAT解题报告] Pop Sequence
简单题,给定入栈顺序是1-n,再给一个出栈顺序,多了一个条件,堆栈的最大容量给定,问是否可能达到这个出栈队列。
分析: 直接用一个堆栈模拟。假设我们现在考虑1..(i -1)都进入了堆栈,i还没有进入堆栈。
我们一个一个元素考虑出栈序列的元素x:
考虑两种情况:
(1) i > x
这时x入过堆栈了。
(1.1) 如果它不是堆栈顶,我们无法pop出x了——后面再怎么入栈都无法第一个弹出x,这不可能。
(1.2) 如果x是堆栈顶,直接从堆栈pop就可以了,处理下一个出栈元素。
(2) i <= x
这时x还没有入栈,要想让x出栈,我们必须把从i到x都压入堆栈,这时x在顶端,pop出来即可。但是要注意,压入这么多元素要保证堆栈里面元素的个数不超过给定的堆栈容量,否则也是不可能。
总之,细致处理这两种情况,用堆栈模拟即可。
代码:
#include <stack>
#include <cstdio>
using namespace std;
int main() {
int m,n,k;
for (scanf("%d%d%d",&m,&n,&k);k;--k) {
bool can = true;
stack<int> s;
for (int i = 1, j = 0; j < n; ++j) {
int x;
scanf("%d",&x);
if (can) {
if (i > x) {
if (s.empty() || (s.top() != x)) {
can = false;
}
else {
s.pop();
}
}
else {
for (;(i <= x) && (i <= n) && (s.size() <= m); ++i) {
s.push(i);
}
if ((!s.empty()) && (s.size() <= m) && (s.top() == x)) {
s.pop();
}
else {
can = false;
}
}
}
}
puts(can?"YES":"NO");
}
return 0;
}
原题链接: http://www.patest.cn/contests/pat-a-practise/1051
