剑指offer22,栈的压入、弹出序列(Java实现)

 

import java.util.Stack;

/**
 * 栈的压入、弹出序列
 * 描述:输入两个序列,表示输入和弹出顺序,判断第二个是否是该栈第一个的弹出顺序

    方法:需要一个辅助栈
 * @author lenovo047
 *
 */
public class test22 {
    
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        boolean flag = false;
        //都是一个元素的时候直接判断
        if(pushA.length == 1 && popA.length == 1 && popA[0] == pushA[0]){  
            return true;
        }
        if(pushA.length == 1 && popA.length == 1 && popA[0] != pushA[0]){
            return false;
        }
        
        if(popA != null && pushA != null){       //两个序列都为空,直接返回
            Stack<Integer> stack = new Stack<>();
            int i = 0;  //push的指针
            int j = 0; //pop的指针
            //检查每个出栈
            while(j < popA.length){
                //push中的数是否村入栈
                while(i < pushA.length && pushA[i] != popA[j]){
                    stack.push(pushA[i]);
                    i++;
                }
                //相等的元素直接就过去了
                ++i;
                ++j;
                //定义接下来要出栈元素
                int top = 0;
                //如果要出栈的元素和pop相等,就一直出
                while(!stack.isEmpty() && (top = stack.pop()) == popA[j]){
                    ++j;
                }
                //如果不等了,还放回去
                if(j < popA.length){
                    stack.push(top);
                }
                //当找不到合适出栈元素时,push已经放完了,stack因为不相等也弹不出来,就结束
                if(i >= pushA.length && !stack.isEmpty()){
                    break;
                }
                
            }
            if(stack.isEmpty()){
                flag = true;
            }
            
        }
          
        return flag;
    }

}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值