[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

相关推荐

10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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