day11 |栈与队列part02

栈与队列的应用

相关题目
● 20. 有效的括号
● 1047. 删除字符串中的所有相邻重复项
● 150. 逆波兰表达式求值

有效的括号

力扣链接

实现思路

括号匹配分以为四种情况:
  • 左括号存在,但右括号不存在
  • 左括号存在,右括号存在,且是一对
  • 左括号存在,右括号存在,但不是一对
  • 左括号不存在,右括号存在
对于以上四种情况,使用栈判断如下:
  • 左括号存在,但右括号不存在:字符串遍历完成后,栈不为空
  • 左括号存在,右括号存在,且是一对:所有括号匹配成功,且栈为空
  • 左括号存在,右括号存在,但不是一对:至少有一对括号匹配不成功
  • 左括号不存在,右括号存在:栈为空,但字符串未遍历完成

实现过程

遇左括号入栈;
遇右括号,判断栈是否为空,栈为空时,返回false(情况4);栈不为空时与栈顶元素匹配,匹配成功,栈顶元素出栈(情况2);匹配不成功,返回false(情况3)
字符串遍历完成:判断栈是否为空:栈空,匹配完成,栈不空,返回false(情况1)

public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char[] chars = s.toCharArray();
        int i = 0;
        while (i < chars.length) {
            if (chars[i] == '(' || chars[i] == '[' || chars[i] == '{') {
                stack.push(chars[i]);
            } else if (stack.empty() && (chars[i] == '}' || chars[i] == ']' || chars[i] == ')')) {
                return false;
            } else if (!stack.empty() && (chars[i] == ')' && stack.peek() == '(') || (chars[i] == ']' && stack.peek() == '[') || (chars[i] == '}' && stack.peek() == '{')) {
                stack.pop();
            } else {
                return false;
            }
            i++;
        }
        if (!stack.empty()) {
            return false;
        }
        return true;
    }

删除字符串中的所有相邻重复项

力扣链接
实现思路
使用栈解题。
遍历整个字符串各个元素,后一个元素先于前一个元素,即栈顶元素进行比较,元素相同,栈顶元素出栈;不相同,元素入栈,继续遍历
遍历完成后,依次pop出栈顶元素,并从后向前存入新字符数组中,最后返回字字符数组组成的字符串即可
实现过程

public static String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        char[] chars = s.toCharArray();
        if(chars.length == 0){
            return null;
        }
        stack.push(chars[0]);
        for (int i = 1; i < chars.length; i++) {
            if(!stack.empty() && chars[i] == stack.peek()){
                stack.pop();
            }
            else {
                stack.push(chars[i]);
            }
        }
        if(stack.size() == 0){
            return null;
        }
        char[] newchars = new char[stack.size()];
        for (int i = stack.size()-1; i >=0 ; i--) {
            newchars[i] = stack.pop();
        }
        return new String(newchars);
    }

逆波兰表达式求值

力扣链接
实现思路
遍历字符串数组:遇到数字压栈,遇到算数运算符,栈顶前两个元素依次出栈(注意栈顶元素计算顺序)
实现过程

public static int evalRPN(String[] tokens) {
        Stack<String> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            if (!tokens[i].equals("+") && !tokens[i].equals("-") && !tokens[i].equals("*") && !tokens[i].equals("/")) {
                stack.push(tokens[i]);
            } else if (!stack.empty()) {
                int a = Integer.valueOf(stack.pop());
                int b = Integer.valueOf(stack.pop());
                if (tokens[i].equals("+")) {
                    stack.push(b + a + "");
                } else if (tokens[i].equals("-")) {
                    stack.push(b - a + "");
                } else if (tokens[i].equals("*")) {
                    stack.push(b * a + "");
                } else if (tokens[i].equals("/")) {
                    stack.push(b / a + "");
                }
            }
        }
        return Integer.parseInt(stack.pop());
    }

难点:将字符串转化为整数:Integer.valueOf(String s) 或Integer.parseInt(String s)

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值