• 剑指offer系列19--栈的压入、弹出序列


    题目描述

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

     1 package com.exe4.offer;
     2 
     3 import java.util.ArrayList;
     4 
     5 /**
     6  * 19【题目】输入两个整数序列,第一个序列表示栈的压入顺序,
     7  *             请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
     8  *             例如序列1,2,3,4,5是某栈的压入顺序
     9  *             序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
    10  *    【思路】
    11  * @author WGS
    12  *
    13  */
    14 public class StackPushPopSequence {
    15 
    16     public boolean isPopOrder(int[] pushA,int[] popA){
    17         
    18         
    19         boolean flag=false;
    20         ArrayList<Integer> assistList=new ArrayList<Integer>();
    21     
    22         
    23         if(pushA.length>0 && popA.length>0 && pushA.length==popA.length){
    24             
    25             //当前 popA中的数
    26             int pop=0;
    27             //下一个弹出的元素
    28             int nextPop=0;
    29             //pushA当前元素
    30             int push=0;
    31             //下一个压入的元素
    32             int nextPush=0;
    33             int len=pushA.length;
    34             int index=-1;
    35             while(nextPop-pop<len){//要求的顺序
    36                 //判断 辅助集合中当前元素 与 要求的排列的顺序的栈顶值 不一样时,就加入该栈顶值在pushA中以前的值
    37                 while(assistList.size()==0 || assistList.get(index)!=popA[nextPop]){
    38                     if(nextPush-push==len) break;
    39                     assistList.add(pushA[nextPush]);
    40                     index++;
    41                     nextPush++;
    42                 }
    43                 //再确认下
    44                 if(assistList.get(index)!=popA[nextPop]) break;
    45                 //当该元素及之前元素加入完了之后,就弹出去,指向popA中下个顺序的元素
    46                 assistList.remove(index--);
    47                 nextPop++;
    48             }
    49             if(assistList.size()==0 && nextPop-pop==len){
    50                 flag=true;
    51             }
    52             
    53         }
    54         return flag;
    55         
    56     }
    57     public static void main(String[] args) {
    58         // TODO Auto-generated method stub
    59          int[] pushA = new int[]{1,2,3,4,5};
    60           int[] popA = new int[]{4,5,3,2,1};
    61           System.out.println(new StackPushPopSequence().isPopOrder(pushA, popA));
    62             
    63     }
    64 
    65 }
  • 相关阅读:
    设计模式学习(十二) 责任链模式
    设计模式学习(十一) 享元模式
    设计模式学习(十) 外观模式
    设计模式学习(九) 装饰模式
    设计模式学习(八) 组合模式
    设计模式学习(七) 桥接模式
    设计模式学习(六) 代理模式
    设计模式学习(五) 适配器模式
    设计模式学习(四) 原型模型
    设计模式(三) 建造者模式
  • 原文地址:https://www.cnblogs.com/noaman/p/5444186.html
Copyright © 2020-2023  润新知