zoukankan      html  css  js  c++  java
  • 剑指Offer:栈的压入、弹出序列【31】

    剑指Offer:栈的压入、弹出序列【31】

    题目描述

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

    题目分析

      我们可以找到判断一个序列是不是栈的弹出序列的规律:

      如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;

      如果下一个弹出的数组不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶位置;

      如果所有的数字都压入栈后仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。

    Java题解

    import java.util.ArrayList;
    import java.util.Stack;
    
    
    public class Solution {
        public boolean IsPopOrder(int [] pushA,int [] pushB) {
           int ptrA = 1, ptrB = 0;
            Stack<Integer> stackA = new Stack<>();
            stackA.addElement(pushA[0]);
    
            for (int i = 0; i < pushB.length; i++) {
                while ((ptrA < pushA.length) && stackA.peek() != pushB[ptrB]) {
                    stackA.add(pushA[ptrA]);
                    ptrA++;
                }
                //如果StackA的peek == pushB的当前元素
                if (ptrA <= pushA.length && stackA.peek() == pushB[ptrB]) {
                    stackA.pop();
                    ptrB++;
                    if(ptrB==pushB.length)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
    }
    

      

  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9275727.html
Copyright © 2011-2022 走看看