zoukankan      html  css  js  c++  java
  • 剑指offer(13)-栈的压入、弹出序列 九度1366

    题目来自剑指offer系列 九度 1366:http://ac.jobdu.com/problem.php?pid=1367

    题目描述:
    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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

    看到这个题太熟悉了,数据结构考试中会经常遇到。使用栈模拟一编即可。这里为了效率直接用数组模拟栈了。

    //============================================================================
    // Name        : 栈的序列判断.cpp
    // Author      : coder
    // Version     :
    // Copyright   : www.acmerblog.com
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    const int M=100001;
    int n,stack[M],arr1[M];
    char buf[M*10];
    int main() {
        while(~scanf("%d", &n)){
            int top=0; //栈的顶端位置
            int cnt=0; //已入栈的个数
            int i, k, tmp;
            for(i=0; i<n; i++)
                scanf("%d", &arr1[i]);
            for(k=0; k<n; k++){
                scanf("%d", &tmp);
                //如果栈为空,或栈的顶端元素 不等于 要出栈的, 就一直入栈
                while( top==0 || tmp != stack[top-1] ){
                    stack[top++] = arr1[cnt++];
                    if(cnt>=n) break;
                }
                top--; //出栈
                if(cnt>=n) break;
            }
            k++;
            //所有元素已入栈,则出栈顺序唯一
            bool flag = true;
            for(; k<n; k++){
                scanf("%d", &tmp);
                if( tmp != stack[--top]){
                    flag = false; break;
                }
            }
            gets(buf);//读取剩下多余的
            printf("%s
    ", flag ? "Yes":"No");
        }
        return 0;
    }
    /**************************************************************
        Problem: 1366
        User: 从此醉
        Language: C++
        Result: Accepted
        Time:140 ms
        Memory:3276 kb
    ****************************************************************/
    

      123

    1 fdsfsdf
    View Code

    1

    int main() {
        while(~scanf("%d", &n)){
            int top=0; //栈的顶端位置
            int cnt=0; //已入栈的个数
            int i, k, tmp;
            for(i=0; i<n; i++)
                scanf("%d", &arr1[i]);

    2

    1 int main() {
    2     while(~scanf("%d", &n)){
    3         int top=0; //栈的顶端位置
    4         int cnt=0; //已入栈的个数
    5         int i, k, tmp;
    6         for(i=0; i<n; i++)
    7             scanf("%d", &arr1[i]);

    3

    int main() {
        while(~scanf("%d", &n)){
            int top=0; //栈的顶端位置
            int cnt=0; //已入栈的个数
            int i, k, tmp;
            for(i=0; i<n; i++)
                scanf("%d", &arr1[i]);

    12

    1 int main() {
    2     while(~scanf("%d", &n)){
    3         int top=0; //栈的顶端位置
    4         int cnt=0; //已入栈的个数
    5         int i, k, tmp;
    6         for(i=0; i<n; i++)
    7             scanf("%d", &arr1[i]);
    View Code

    13

    int main() {
        while(~scanf("%d", &n)){
            int top=0; //栈的顶端位置
            int cnt=0; //已入栈的个数
            int i, k, tmp;
            for(i=0; i<n; i++)
                scanf("%d", &arr1[i]);
    View Code

    23

    1 int main() {
    2     while(~scanf("%d", &n)){
    3         int top=0; //栈的顶端位置
    4         int cnt=0; //已入栈的个数
    5         int i, k, tmp;
    6         for(i=0; i<n; i++)
    7             scanf("%d", &arr1[i]);

    123]

    1 int main() {
    2     while(~scanf("%d", &n)){
    3         int top=0; //栈的顶端位置
    4         int cnt=0; //已入栈的个数
    5         int i, k, tmp;
    6         for(i=0; i<n; i++)
    7             scanf("%d", &arr1[i]);
    View Code

    -------------------

    1

    int main() {
        while(~scanf("%d", &n)){
            int top=0; //栈的顶端位置
            int cnt=0; //已入栈的个数
            int i, k, tmp;
            for(i=0; i<n; i++)
                scanf("%d", &arr1[i]);
     
    

      2

    int main() {
        while(~scanf("%d", &n)){
            int top=0; //栈的顶端位置
            int cnt=0; //已入栈的个数
            int i, k, tmp;
            for(i=0; i<n; i++)
                scanf("%d", &arr1[i]);
    

      12 

    int main() {
        while(~scanf("%d", &n)){
            int top=0; //栈的顶端位置
            int cnt=0; //已入栈的个数
            int i, k, tmp;
            for(i=0; i<n; i++)
                scanf("%d", &arr1[i]);
    

      

  • 相关阅读:
    [转]windows Mobile使用ActiveSync上网
    C++剪切板操作
    jdk1.8源码分析hashMap
    【杂项】VMware 虚拟机安装ubuntu 16.04教程
    【Linux命令】数据流重定向
    【ceph | 运维】crush相关命令
    【Linux命令】更改hostname
    【Linux命令】sed命令
    【Linux命令】vim基本快捷键
    【Linux命令】install
  • 原文地址:https://www.cnblogs.com/love533/p/3503723.html
Copyright © 2011-2022 走看看