首页 > 其他 > 详细

剑指OFFER之栈的压入、弹出序列(九度OJ1366)

时间:2014-06-10 00:02:36      阅读:459      评论:0      收藏:0      [点我收藏+]

题目描述:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

 

输入:

每个测试案例包括3行:

第一行为1个整数n(1<=n<=100000),表示序列的长度。

第二行包含n个整数,表示栈的压入顺序。

第三行包含n个整数,表示栈的弹出顺序。

 

输出:

对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出Yes,否则输出No。

 

样例输入:
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2

 

样例输出:
Yes
No

解题思路:

  重新按照第一组数据入栈,每次入栈都检查一下,是否跟出栈的内容相同,如果相同,则出栈。

  最后,如果这个栈内不存在元素,则证明第二个序列为出栈序列。

代码:

bubuko.com,布布扣
#include <stdio.h>
#include <stdlib.h>
int arr[100005] = {0};
int test[100005] = {0};
int testStack(int n);
int main(int argc, char const *argv[])
{
    int n,i;
    while(scanf("%d",&n)!=EOF && n>=1 && n<=100000){
        for(i=0;i<n;i++){
            scanf("%d",&arr[i]);
        }
        for(i=0;i<n;i++){
            scanf("%d",&test[i]);
        }
        if(testStack(n))
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
int testStack(int n){
    int temp[100005]={0};
    int top=0;
    int j=0;
    int i;
    for(i=0;i<n;i++){
        temp[top++] = arr[i];
        while(top>0 && temp[top-1] == test[j]){
            j++;
            top--;
        }
    }
    if(top)
        return 0;
    else
        return 1;
}
/**************************************************************
    Problem: 1366
    User: xhalo
    Language: C
    Result: Accepted
    Time:230 ms
    Memory:2012 kb
****************************************************************/
bubuko.com,布布扣

 

剑指OFFER之栈的压入、弹出序列(九度OJ1366),布布扣,bubuko.com

剑指OFFER之栈的压入、弹出序列(九度OJ1366)

原文:http://www.cnblogs.com/xing901022/p/3773785.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!