• 牛客网—栈的压入、弹出序列


    本次写的题目是栈的压入、弹出序列,为牛客网里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎

     🌱分析阶段

    按照右边的函数的形参我们可以知道,左边的是栈放入顺序,右边的栈中元素的弹出顺序,我们通过自己的尝试,来判断可不可以按照右边的元素弹出。通过题目的示例来理解👇:

    🌿示例1:

    此时示例一是正确的。

     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     🌿示例2:

    该示例的最终结果是false。 

     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    在上面的动图示例演示中我们也可以看到,两个数组中都要遍历,然后先将栈的放入顺序数组里面的元素给先放入,然后再从弹出的数组里面看是否为要弹出元素,是就弹出,不是则继续放入元素,直至走完放入顺序数组,最后再将弹出数组走完。

    在这中间我们还要讨论几种情况:①放入顺序数组走完,弹出的数组还未走完;②在碰到要弹出的元素的时候,要一直弹出直到栈顶元素不为要弹出的元素。这些也是我们需要注意的地方。


     🌱代码阶段

    在正式编写代码前,我们要先来考虑特殊情况:如果一开始pushA数组不存在或者popA数组不存在,那么就可以直接判定为false。代码如下👇:

    1. import java.util.*;
    2. import java.util.ArrayList;
    3. public class Solution {
    4. public boolean IsPopOrder(int [] pushA,int [] popA) {
    5. if(pushA==null) return false;
    6. if(popA==null) return false;
    7. }
    8. }

    然后再根据之前分析的,先创建一个栈,然后使用for语句循环一遍pushA数组👇:

    1. import java.util.*;
    2. import java.util.ArrayList;
    3. public class Solution {
    4. public boolean IsPopOrder(int [] pushA,int [] popA) {
    5. if(pushA==null) return false;
    6. if(popA==null) return false;
    7. int i = 0;
    8. int j = 0;
    9. Stack stack = new Stack<>();
    10. for(i = 0; i//遍历一遍pushA数组
    11. stack.push(pushA[i]); //先将当前i指向的元素放入栈,之后再判断是不是需要弹出的元素
    12. }
    13. }
    14. }

    接下来就是判断为不为需要弹出的元素,在这里我们特别需要注意的是:如果在碰到要弹出元素在弹出栈顶的要弹出之后栈顶的元素又是要弹出的元素,我们要用while语句一直弹出,直至栈顶元素不为要弹出元素或者栈为空的时候。进入while的条件我们要特别注意先判断是不是空栈再判断栈顶元素是不是要弹出元素。具体代码如下👇:

    1. import java.util.*;
    2. import java.util.ArrayList;
    3. public class Solution {
    4. public boolean IsPopOrder(int [] pushA,int [] popA) {
    5. if(pushA==null) return false;
    6. if(popA==null) return false;
    7. int i = 0;
    8. int j = 0;
    9. Stack stack = new Stack<>();
    10. for(i = 0; i//遍历一遍pushA数组
    11. stack.push(pushA[i]); //先将当前i指向的元素放入栈,之后再判断是不是需要弹出的元素
    12. while(!stack.isEmpty()&&stack.peek()==popA[j]){
    13. //先判断不为空栈后再判断栈顶元素是不是要弹出的元素
    14. stack.pop();
    15. j++;
    16. }
    17. }
    18. }
    19. }

    在写完上面代码之后其实完成的差不多了😎但是我们还需要注意多一种情况:就是当我们pushA数组里面的元素都放完了,但是还没有弹出元素,这时候我们就又要使用多一个while语句,保证在栈不空,且popA里面的元素还没有完全弹出的时候进入while语句,进入while语句后我们要判断栈顶元素是不是下一个要弹出元素,如果是就让栈弹出栈顶元素,然后popA的指针j继续往后走;如果不是则直接返回false。如果走出了while语句,或者直接跳过了while语句,说明已经按照顺序弹出元素,则最后返回true。具体代码如下👇:

    1. import java.util.*;
    2. import java.util.ArrayList;
    3. public class Solution {
    4. public boolean IsPopOrder(int [] pushA,int [] popA) {
    5. if(pushA==null) return false;
    6. if(popA==null) return false;
    7. int i = 0;
    8. int j = 0;
    9. Stack stack = new Stack<>();
    10. for(i = 0; i//遍历一遍pushA数组
    11. stack.push(pushA[i]); //先将当前i指向的元素放入栈,之后再判断是不是需要弹出的元素
    12. while(!stack.isEmpty()&&stack.peek()==popA[j]){
    13. //先判断不为空栈后再判断栈顶元素是不是要弹出的元素
    14. stack.pop();
    15. j++;
    16. }
    17. }
    18. while(!stack.isEmpty()&&j//先判断不为空栈后再判断栈顶元素是不是要弹出的元素
    19. if(stack.peek()==popA[j]){
    20. j++;
    21. stack.pop();
    22. }else{
    23. return false;
    24. }
    25. }
    26. return true;
    27. }
    28. }

    以上,便是全部代码了😎运行来逝逝吧 ~

     nice😎✨

  • 相关阅读:
    代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160.链表相交、142.环形链表II
    Slimming剪枝方法
    遍历判断linux某些目录的文件是否都有执行权限
    Java中的类加载器双亲委派模型机制
    后台获取不到请求头中token信息的解决方法
    【Gitee】使用IDEA上传本地的项目到Gitee
    web前端-html-css-HACK(CSS Hack 实际上指的就是一个特殊的代码,这段代码只在某些特殊的浏览器中可以识别)
    部署安装yapi
    简单的kafka&redis学习之kafka
    面试官都震惊,你这网络基础可以啊!
  • 原文地址:https://blog.csdn.net/Green_756/article/details/126526856