代码随想录 Day11 - 栈与队列(中)

简介: 代码随想录 Day11 - 栈与队列(中)

作业题


20. 有效的括号

输入字符串判断时,遇到 "}])"时,即可和栈尾做对比,若匹配,则抵消。

package jjn.carl.stack_queue;
import java.util.*;
/**
 * @author Jiang Jining
 * @since 2023-07-09 11:39
 */
public class LeetCode20 {
    public boolean isValid(String s) {
        if (s == null) {
            return false;
        }
        Deque<Character> cur = new ArrayDeque<>();
        Map<Character, Character> map = new HashMap<>();
        map.put('}', '{');
        map.put(')', '(');
        map.put(']', '[');
        for (int i = 0; i < s.length(); i++) {
            if (cur.isEmpty() || !Objects.equals(cur.peekLast(), map.get(s.charAt(i)))) {
                cur.offer(s.charAt(i));
            } else {
                cur.pollLast();
            }
        }
        return cur.isEmpty();
    }
    public static void main(String[] args) {
        System.out.println("new LeetCode20().isValid(\"()[]{}\") = " + new LeetCode20().isValid("()[]{}"));
        System.out.println("new LeetCode20().isValid(\"{[]}\") = " + new LeetCode20().isValid("{[]}"));
    }
}


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

每个字符均与栈顶元素做对比,若相同则抵消,要么压栈,考虑字符串操作,直接使用 StringBuilder 类进行操作。


package jjn.carl.stack_queue;
import java.util.Objects;
/**
 * @author Jiang Jining
 * @since 2023-07-09 14:54
 */
public class LeetCode1047 {
    public String removeDuplicates(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        for (char c : s.toCharArray()) {
            if (stringBuilder.isEmpty() || !Objects.equals(stringBuilder.charAt(stringBuilder.length() - 1), c)) {
                stringBuilder.append(c);
            } else {
                stringBuilder.deleteCharAt(stringBuilder.length() - 1);
            }
        }
        return stringBuilder.toString();
    }
    public static void main(String[] args) {
        String removedDuplicates = new LeetCode1047().removeDuplicates("abbaca");
        System.out.println("removedDuplicates = " + removedDuplicates);
    }
}


150. 逆波兰表达式求值

碰到“+”,“-”,“*”,“/”符号时,则取出栈顶的两个数进行计算,并压入栈中;碰到数字则直接压栈。


package jjn.carl.stack_queue;
import java.util.Set;
import java.util.Stack;
/**
 * @author Jiang Jining
 * @since 2023-07-09 15:16
 */
public class LeetCode150 {
    public int evalRPN(String[] tokens) {
        Set<String> operations = Set.of("+", "-", "*", "/");
        Stack<Integer> stack = new Stack<>();
        for (String token : tokens) {
            if (isOperation(token, operations)) {
                int first = stack.pop();
                int second = stack.pop();
                stack.push(calc(first, second, token));
            } else {
                stack.push(Integer.parseInt(token));
            }
        }
        return stack.pop();
    }
    private boolean isOperation(String token, Set<String> operations) {
        return operations.contains(token);
    }
    private int calc(int first, int second, String operation) {
        if ("+".equals(operation)) {
            return second + first;
        }
        if ("-".equals(operation)) {
            return second - first;
        }
        if ("*".equals(operation)) {
            return second * first;
        }
        return second / first;
    }
    public static void main(String[] args) {
        int result = new LeetCode150().evalRPN(new String[]{"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"});
        System.out.println("result = " + result);
    }
}

目录
相关文章
|
3天前
栈的几个经典应用,真的绝了
文章总结了栈的几个经典应用场景,包括使用两个栈来实现队列的功能以及利用栈进行对称匹配,并通过LeetCode上的题目示例展示了栈在实际问题中的应用。
栈的几个经典应用,真的绝了
|
4天前
|
存储 网络协议 Linux
用户态协议栈06-TCP三次握手
用户态协议栈06-TCP三次握手
|
3天前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
6 0
|
3天前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
5 0
|
4天前
|
存储
全局变量和局部变量在堆和栈的区别
全局变量和局部变量在堆和栈的区别
9 0
|
4天前
|
存储 人工智能 运维
高质量存储力发展问题之浪潮信息发布的大模型智算软件栈的定义如何解决
高质量存储力发展问题之浪潮信息发布的大模型智算软件栈的定义如何解决
8 0
|
5天前
|
设计模式 算法 C语言
【CPP】栈、双端队列、队列、优先级队列与反向迭代器
【CPP】栈、双端队列、队列、优先级队列与反向迭代器
【数据结构】栈和队列
【数据结构】栈和队列
|
5天前
|
算法 C语言 C++
【practise】栈的压入和弹出序列
【practise】栈的压入和弹出序列
|
5天前
|
C语言
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
这篇文章展示了如何使用栈(包括顺序栈和链栈)实现将十进制数值转换成八进制数值的方法,通过C语言编程演示了两种栈的实现方式和使用场景。
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值