剑指offer30 栈的压入、弹出序列

栈的压入、弹出序列

https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&tqId=23290&ru=%2Fpractice%2F4c776177d2c04c2494f2555c9fcc1e49&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13

思路:

  • 题目要我们判断两个序列是否符合入栈出栈的次序,我们就可以用一个栈来模拟。对于入栈序列,只要栈为空,序列肯定要依次入栈。那什么时候出来呢?自然是遇到一个元素等于当前的出栈序列的元素,那我们就放弃入栈,让它先出来。
//入栈:栈为空或者栈顶不等于出栈数组
while(j < n && (s.isEmpty() || s.peek() != popA[i])){
    s.push(pushA[j]);
    j++;
}

  • 如果能按照这个次序将两个序列都访问完,那说明是可以匹配入栈出栈次序的。

具体做法

  • step 1:准备一个辅助栈,两个下标分别访问两个序列。
  • step 2:辅助栈为空或者栈顶不等于出栈数组当前元素,就持续将入栈数组加入栈中。
  • step 3:栈顶等于出栈数组当前元素就出栈。
  • step 4:当入栈数组访问完,出栈数组无法依次弹出,就是不匹配的,否则两个序列都访问完就是匹配的。 alt

代码

import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Stack<Integer> stack=new Stack<>();
        int j=0;
        int n=pushA.length;
      	//遍历出栈元素
        for(int i=0;i<n;i++){
          //只要 值不等于出栈元素就入栈 
          //遍历入栈
            while(j<n&&(stack.isEmpty()||stack.peek()!=popA[i])){
                stack.push(pushA[j]);
                j++;
            }
          //栈顶等于出栈元素就出栈
            if(stack.peek()==popA[i]){
                stack.pop();
            }
          //不相等直接返回false
            else{
                return false;
            }
            
        }
        return true;
      
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-19 14:56
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务