[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
全部评论
#include<cstdio> #include<stack> using namespace std; stack<int> st; int main() { int m, n, k; scanf("%d%d%d", &m, &n, &k); while (k--) { int t = n; int num = 1; bool flag = true; while (t--) { int x; scanf("%d", &x); while(num<=x) st.push(num++); int last = st.top(); if (last != x|| st.size() > m) flag = false; st.pop(); } if (flag) printf("YES\n"); else printf("NO\n"); } return 0; }
点赞 回复 分享
发布于 2017-07-28 09:27

相关推荐

2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务