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

11 篇文章 0 订阅
8 篇文章 0 订阅
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<Integer,Integer> value_index = new Hashtable<>();
        for(int i=0;i<pushA.length;i++){//初始化 值——下标 对应关系
            value_index.put(pushA[i],i);
        }

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

        //遍历一遍,检查是否为弹出序列,遍历的值只能大于等于最大下标栈栈顶值
        for(int i=0;i<popA.length;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<max_index.peek()){//小于最大下标栈栈顶值,检查出不是弹出序列
                return false;
            }
        }

        //没检查出错误,返回true
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值