[java-算法-数据结构] 判断栈的弹出顺序是否正确

package stack;

import java.util.Hashtable;
import java.util.Stack;

/**
 * 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
 * 假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,
 * 但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
 * Created by ZeHua on 2017/5/15.
 */
public class IsPopOrder {
    //通过比较下标判断是否为弹出序列,出现第一个
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        if(pushA.length!=popA.length)return false;
        if(popA.length==1&&popA[0]!=pushA[0]){
            return false;
        }else if(popA.length==1&&popA[0]==pushA[0]){
            return true;
        }
        //通过值找下标
        Hashtable value_index = new Hashtable<>();
        for(int i=0;i//初始化 值——下标 对应关系
            value_index.put(pushA[i],i);
        }

        //目前下标最大值,改为最大下标栈
        Stack max_index = new Stack<>();
        //结束压栈的pushA下标
        int end_index = 0;

        //遍历一遍,检查是否为弹出序列,遍历的值只能大于等于最大下标栈栈顶值
        for(int i=0;i//目前popA[i]的值在pushA的下标
            int cur_index_popAinPushA  = value_index.get(popA[i]);

//            int top_maxStack=max_index.peek();
            //大于最大下标栈栈顶值或栈为空,则压栈
            if(max_index.isEmpty()||cur_index_popAinPushA>max_index.peek()){
                for(int j=end_index;j<=cur_index_popAinPushA;j++){
                    max_index.push(j);
                }
                end_index= max_index.pop()+1;
                continue;
            }
            //等于最大下标栈栈顶值,则弹栈
            if(cur_index_popAinPushA==max_index.peek()){
                max_index.pop();
                continue;
            }


            if(cur_index_popAinPushA//小于最大下标栈栈顶值,检查出不是弹出序列
                return false;
            }
        }

        //没检查出错误,返回true
        return true;
    }
}

你可能感兴趣的:(java,数据结构,算法)