剑指offer: 栈的压入、弹出序列 java实现

题目:

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

思路:

新建一个栈,根据入栈顺序依次入栈,每入一个和出栈顺序比较,应该出栈就出栈,不应该出栈就继续进栈,最后栈空且入栈出栈数组都走到了结尾,返回true

步骤:

先将第一个元素入栈,将栈顶元素和popA[j]比较,

若相等,且栈不空,则栈顶元素出栈,j++;

若不相等,且入栈数组没有走到头(i<pushA.length),则pushA[i]入栈

可以入栈和出栈只有这两种情况,其他情况break;

最后判断栈是否为空,空返回true, 不空返回false

代码:

import java.util.ArrayList;
import java.util.Stack;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Stack<Integer> stack = new Stack<Integer>();
        stack.push(pushA[0]);//第一个元素先入栈
        int i = 1;//遍历pushA,入栈序列
        int j = 0;//遍历popA,出栈序列
        while (j < popA.length) {
            if ((stack.empty() != true) && (stack.peek() == popA[j])) {
                //栈顶元素等于当前popA[j],将栈顶元素出栈
                stack.pop();
                j++;
            } else if ((stack.peek() != popA[j]) && i < pushA.length) {//若栈顶元素不等于popA[j]且i小于pushA的长度,则pushA[i]继续入栈
                stack.push(pushA[i]);            //应注意&&后面的条件,开始没通过就是因为没有考虑到“pushA已经走到头了,不能再入栈"的情况
                i++;
            } else {
                break;
            }
        }
        if (stack.empty()) {
            return true;
        } else {
            return false;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值