2014 UESTC Training for Data Structures K - 方师傅与栈

本文介绍了一种通过栈操作模拟来判断两个序列是否可以通过特定的栈操作相互转换的方法。利用这一思路,可以解决一系列关于序列转换的问题,适用于算法竞赛及编程实践。

K - 方师傅与栈

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

方师傅有一个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\n");else printf("No");
    return 0;
}

 

 

 

转载于:https://www.cnblogs.com/Atlantis67/p/3701221.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值