码迷,mamicode.com
首页 > 其他好文 > 详细

栈的压入、弹出序列

时间:2015-08-02 13:49:49      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:剑指offer      

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


拿到这道题的时候,首先想着是把所有的不可能的出栈序列找出来,然后寻找和出栈序列之间的规律,但是找了好久没找到。

看了一下书上的思路,这不就是自己大脑判断时的思路么?

入栈序列:1,2, 3 , 4 , 5
出栈序列:4 , 5 , 3 , 2 , 1

看到第一个出栈的是4,所以4之前的必须先入栈,在入栈序列中找到这个第一个出栈的4,顺便自定义一个栈stack,让1,2,3,4依次入栈。
stack此时值为{1,2,3,4,}

接下来定义一个指针popIndex指向出现序列的第一个元素,模拟出栈。
stack.pop一次,指针popIndex向后移动。
此时发现stack的栈顶和出栈序列的指针指向的值不相等(3 != 5)

此时再到入栈序列中寻找5,如果没有找到,那么就说明此序列不是出栈序列。
如果找到了,将这个5入栈,此时stack={1,2,3,5};
指针popIndex指向出栈序列中的5,然后出栈一次,popIndex前移,知道popIndex大于出占序列的长度。

代码如下:

    public static boolean isPop(String push,String pop)
    {
        boolean isp = false;


        if(push==null || pop==null)return isp;
        if(push.length() !=pop.length() )return isp;
        if(pop.length()<=0)return isp;


        Stack<Integer> st = new Stack<Integer>();

        int popIndex=0,pushIndex=0;

        while(popIndex < pop.length())  
        {

            for(;pushIndex<push.length();pushIndex++)
            {
                int temp = push.charAt(pushIndex)-‘0‘;

                st.push(temp);  

                if(pop.charAt(popIndex) == push.charAt(pushIndex))break;

            }

            //入栈队列中找不到出栈的某一个值  
            if(pushIndex >= push.length())break;


            while(!st.empty()&&st.peek() == pop.charAt(popIndex)-‘0‘)
            {
                st.pop();
                popIndex++;

            }

            if(st.empty()&&pop.length()==popIndex)isp=true;
            pushIndex++;
        } 

          return isp;

    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

栈的压入、弹出序列

标签:剑指offer      

原文地址:http://blog.csdn.net/u014307117/article/details/47205717

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!