• 面试高频考题解法——栈的压入弹出序列、有效的括号、逆波兰表达式求值


    目录

    热身:

    JZ31栈的压入、弹出序列

    逆波兰表达式求值

    有效的括号


    热身:

    1. 1 . 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
    2.   A: 1,4,3,2   B: 2,3,4,1   C: 3,1,4,2   D: 3,4,2,1

            分析:这里有个隐含条件,压栈序列1,2,3,4,当时压栈,当时就可以出栈,简单来讲,让1进栈时,当时就可以将1弹出栈,再往后进栈;

            如此分析,只有B选项符合条件:1进栈,2进栈,与B选项第一个出栈序列匹配,弹出2,再看进栈序列中:1与弹出序列的3不匹配,继续对进栈序列的下一个元素比较,如此往复,可得出答案。


    JZ31栈的压入、弹出序列

     思路:

    1. 创建一个栈stack
    2. 对进栈序列先压栈再与出栈序列比较
    3. 若相等则弹出
    1. import java.util.*;
    2. import java.util.ArrayList;
    3. public class Solution {
    4. public boolean IsPopOrder(int [] pushA,int [] popA) {
    5. Stack stack = new Stack<>();
    6. int count = 0;//计数:与压栈数据匹配则加一
    7. for(int i = 0; i < pushA.length; i++){
    8. if(pushA[i] == popA[count]){
    9. //先压栈,再判断
    10. stack.push(pushA[i]);
    11. while(stack.peek() == popA[count]){
    12. stack.pop();
    13. count++;
    14. //popA遍历完说明正确
    15. if(count == pushA.length){
    16. return true;
    17. }
    18. /**
    19. *弹出栈后,可能一个元素也不剩,这时再到while里判断,
    20. *有可能能造成对空指针的解引用操作
    21. */
    22. if(stack.empty()){
    23. break;
    24. }
    25. }
    26. }
    27. else{
    28. stack.push(pushA[i]);
    29. }
    30. }
    31. return false;
    32. }
    33. }

    逆波兰表达式求值

    博主已整理出博客,快去看看吧~

    http://t.csdn.cn/adU0q


    有效的括号

    也是对栈的理解中,频率较高的考题

          思路:

                    1.创建一个栈

                    2.大的方向上遍历给定数组

                    3.小的方向上比较是否匹配

          注意:不匹配分为以下几种情况

                    a.左右括号不匹配

                    b.右括号多:当前下标是右括号,但栈为空

                    c.左括号多:字符串数组遍历完成,但栈仍不为空

    1. class Solution {
    2. public boolean isValid(String s) {
    3. Stack stack = new Stack<>();
    4. for(int i = 0; i < s.length(); i++){
    5. char ch = s.charAt(i);
    6. if(ch == '(' || ch == '{' || ch == '['){
    7. stack.push(ch);
    8. }
    9. else{
    10. //说明ch是右括号
    11. if(stack.empty()){
    12. //右括号多
    13. return false;
    14. }
    15. char tmp = stack.peek();
    16. if(tmp == '(' && ch == ')' ||
    17. tmp == '{' && ch == '}' ||
    18. tmp == '[' && ch == ']'){
    19. //当前括号匹配
    20. stack.pop();
    21. }
    22. else{
    23. //左右括号不匹配
    24. return false;
    25. }
    26. }
    27. }
    28. //判断是否为空
    29. if(stack.empty()){
    30. return true;
    31. }
    32. else{
    33. //左括号多
    34. return false;
    35. }
    36. }
    37. }

  • 相关阅读:
    【AGC】构建服务3-认证服务示例
    数据结构-----串(String)详解
    文件系统XFS与EXF4的区别
    软件测试的就业前景到底怎么样?
    代码随想录——钥匙和房间(图论)
    邱锡鹏神经网络怎么样,邱锡鹏神经网络答案
    【Qt一坑】qt编译出现“常量中有换行符”
    Git 本地文件合并和恢复
    一本通1042;奇偶ASCII值判断
    蓝牙智能音箱采用哪些音频功放芯片
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/126087254