[豪の算法奇妙冒险] 代码随想录算法训练营第十天 | 232-用栈实现队列、225-用队列实现栈、20-有效的括号、1047-删除字符串中的所有相邻重复项

代码随想录算法训练营第十天 | 232-用栈实现队列、 225-用队列实现栈、20-有效的括号、1047-删除字符串中的所有相邻重复项


LeetCode232 用栈实现队列

题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/description/

文章讲解:https://programmercarl.com/0232.用栈实现队列.html

视频讲解:https://www.bilibili.com/video/BV1nY4y1w7VC/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 这题要用栈来实现队列的先进先出,但是栈是先进后出的,因此我们可以设置两个栈来模拟队列,一个作为入栈,一个作为出栈

​ 元素一开始放进入栈,要取的时候再从入栈放入出栈,再从出栈拿元素,这样元素就是先进先出

image-20251130171920310

class MyQueue {

    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        move();
        return stackOut.pop();
    }
    
    public int peek() {
        move();
        return stackOut.peek();
    }
    
    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    public void move(){
        if(!stackOut.empty()){
            return;
        }
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}

LeetCode225 用队列实现栈

题目链接:https://leetcode.cn/problems/implement-stack-using-queues/submissions/681722036/

文章讲解:https://programmercarl.com/0225.用队列实现栈.html

视频讲解:https://www.bilibili.com/video/BV1Fd4y1K7sm/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 这里采用一个队列来模拟栈,栈是先进后出,队列是先进先出,当实现栈pop()的时候,要的是队列的队尾元素,所以我们可以将队尾前的元素都出队再入队,这样最前面的那个元素就是之前的队尾元素

image-20251130191441030

class MyStack {

    Queue<Integer> que;

    public MyStack() {
        que = new LinkedList<>();
    }
    
    public void push(int x) {
        que.offer(x);
    }
    
    public int pop() {
        move();
        return que.poll();
    }
    
    public int top() {
        move();
        int result = que.poll();
        que.offer(result);
        return result;
    }
    
    public boolean empty() {
        return que.isEmpty();
    }

    public void move(){
        int size = que.size();
        for(int i = 1; i <= size-1; i++){
            que.offer(que.poll());
        }
    }
}

LeetCode20 有效的括号

题目链接:https://leetcode.cn/problems/valid-parentheses/description/

文章讲解:https://programmercarl.com/0020.有效的括号.html

视频讲解:https://www.bilibili.com/video/BV1AF411w78g/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 括号匹配,很经典的栈应用题,遇到左括号将其放入栈,遇到右括号出栈一个元素进行比对,若匹配则可以继续往下遍历括号串,若不匹配则直接return false

​ 注意pop空栈的问题,以及最后记得检查栈是否为空,若不为空说明还有为匹配的左括号,return false

image-20251130193118828

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        if(s.length() % 2 != 0){
            return false;
        }

        for(int i = 0; i < s.length(); i++){
            char ch = s.charAt(i);
            if(ch == '(' || ch == '[' || ch == '{'){
                stack.push(ch);
            }else{
                if(stack.isEmpty()){
                    return false;
                }
                char top = stack.pop();
                if((ch == ')' && top == '(')||(ch == ']' && top == '[')||(ch == '}' && top == '{')){
                    continue;
                }else{
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

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

题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/

文章讲解:https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html

视频讲解:https://www.bilibili.com/video/BV12a411P7mw/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 栈记住了遍历数组当前元素的前一个元素,所以这种相邻元素消除的工作很适合用栈来做

​ 核心逻辑是判断栈顶元素和当前元素是否相同,若相同则一起消除,若不相同则将当前元素入栈

image-20251130195139474

class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        int length = s.length();
        if(length == 1){
            return s;
        }
        for(int i = 0;i < length;i++){
            char cur = s.charAt(i);
            if(stack.isEmpty()){
                stack.push(cur);
            }else{
                char top = stack.peek();
                if(cur != top){
                    stack.push(cur);
                }else{
                    stack.pop();
                }
            }
        }
        StringBuilder result = new StringBuilder();
        while(!stack.isEmpty()){
            result.append(stack.pop());
        }
        return result.reverse().toString();
    }
}
posted @ 2025-11-30 19:58  SchwarzShu  阅读(4)  评论(0)    收藏  举报