算法-栈的压入、弹出序列(我与别人的差距)

版权声明:转载请注明来源 https://blog.csdn.net/tangyuan_sibal/article/details/88674660

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

思路:使用一个辅助栈来模拟进栈和出栈的过程。我的想法是首先找到第一个进栈的元素,然后开始比较栈顶的元素和序列的是不是一样,如果不一样就继续进栈,相同就出栈,当全部进栈完了,但是还没有匹配完就返回false。

我的代码

import java.util.Stack;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
      Stack<Integer> stack = new Stack<>();
        int temp = 1;
        int m = 0;
        //因为是一样长的,判断一个就可以了
      if(pushA.length==0)
          return false;
        //判断只有一个元素的情况,因为我是要找到有一个相同元素的思路
        //当只有一个元素时栈空,直接到最后返回true,所以应该判断
        if(pushA.length==1&&(pushA[0]!=popA[0]))
            return false;

      for(int i=0;i< pushA.length;i++)
      {
          if(pushA[i]!= popA[0])
          {
               stack.push(pushA[i]);
              
          }
             
          else
          {
               m = i;
               break;
          }
              
          }
        m++;
       //入栈完之后开始判断
       while(!stack.isEmpty())
       {
           //当跟栈顶匹配时出栈
           if(stack.peek()==popA[temp])
           {
               temp++;
               stack.pop();
           }
           //不匹配时出栈
           else 
           {
               //当元素都入栈完了返回false
               if(m > pushA.length-1)
                   return false;
               stack.push(pushA[m]);
               m++;
               
           }
            
       }
        return true;
    }
}

大佬的代码

public boolean IsPopOrder(int [] pushA,int [] popA) {
       if (pushA.length == 0 || popA.length == 0) {
           return false;
       }
     Stack<Integer> stack = new Stack<Integer>();
       int j = 0;
       for (int i = 0; i < popA.length; i++) {
           stack.push(pushA[i]);
           while (j < popA.length && stack.peek() == popA[j]) {
               stack.pop();
               j++;
           }
 
       }
       return stack.empty() ? true : false;
   }

虽然我的代码繁琐点,但是时间复杂度低啊,但是代码能力还是有待提高的。。。

猜你喜欢

转载自blog.csdn.net/tangyuan_sibal/article/details/88674660