• 2014 UESTC Training for Data Structures K


    K - 方师傅与栈

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
     

    方师傅有一个1N的排列,排列的顺序是固定的,他想要把这个排列重新排列成他喜欢的顺序。

    于是他买了一个栈,他会按顺序将排列扔进栈内,在某些时刻将栈顶元素取出,这样出栈后的排列就可以重新排序啦。

    例如,原序列是1,2,他先将1入栈,再将2入栈,然后将2出栈,最后将1出栈,那么新序列就变成了2,1

    方师傅很好奇,当前排列能不能通过一个栈变成他想要的排列呢?

    Input

    输入第1行包含1个数字N,代表方师傅的排列的长度。

    接下来1行包含N个整数,代表最开始方师傅的排列。

    接下来1行包含N个整数,代表方师傅想要的排列。

    N1000000

    Output

    输出包含1个字符串Yes或者No,代表方师傅能否成功

    Sample input and output

    Sample InputSample Output
    3
    3 2 1
    1 2 3
    Yes
    4
    1 2 3 4
    3 1 2 4
    No
     

    题意:给两个序列问第二个序列B是否能通过第一个序列A通过栈处理得到;

    纯模拟,假设有一个栈,如果当前栈顶等于A的开头,就弹出栈顶元素,不然B就继续进栈。直到结束如果栈里没有元素则成功,不然失败。

    轻松AC。

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;
    long long q[1000008],w[1000008],z[1000008];
    int main()
    {
        int n,j,k,l;
        memset(w,0,sizeof(w));
        scanf("%d",&n);
        for (j=1;j<=n;j++) scanf("%I64d",&q[j]);
        for (j=1;j<=n;j++) scanf("%I64d",&w[j]);
        j=1;k=1;l=0;
        while (j<=n){
            while (q[j]!=w[k] && j<=n)
                {l++;z[l]=q[j];j++;}
            while (q[j]==w[k] && j<=n)
            {
                j++;k++;
            }
            while (w[k]==z[l] && k<=n)
                {l--;k++;}
            if (k>n) break;
        }
        if (k>n && j>n) printf("Yes
    ");else printf("No");
        return 0;
    }
  • 相关阅读:
    [转载] Oracle之内存结构(SGA、PGA)
    此生若能得幸福安稳,谁又愿颠沛流离
    隐式转换和显式转换及强制转换的区别
    System.Web.Optimization对脚本和样式表的操作
    js 时间日期函数小结
    jQuery 中bind(),live(),delegate(),on() 区别
    Html.Partial()传值的问题
    js过滤HTML标签以及&nbsp;
    select ROW_NUMBER() over(PARTITION BY InfoType order by NewsID)as rowid from News
    Asp.net单点登录解决方案
  • 原文地址:https://www.cnblogs.com/Atlantis67/p/3701221.html
Copyright © 2020-2023  润新知