代码随想录二刷第九天 | 232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

232.用栈实现队列

题目:232. 用栈实现队列 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

两个栈,一个用于入队stackIn,一个用于出队stackOut。

push时直接进入stackIn,pop时要讨论,stackOut不为空直接pop,否则将stackIn整体放到stackOut

代码

java 复制代码
class MyQueue {
    Stack<Integer> stackIn = new Stack<>();
    Stack<Integer> stackOut = new Stack<>();
    
    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        copy();
        return stackOut.pop();
    }
    
    public int peek() {
        copy();
        return stackOut.peek();
    }

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

225. 用队列实现栈

题目:225. 用队列实现栈 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

用一个队列实现,每次出栈时都把需要弹出元素之外的其余元素重新入队。

代码

java 复制代码
class MyStack {
    Queue<Integer> queue;
    
    public MyStack() {
        queue = new LinkedList<>();
    }
    
    public void push(int x) {
        queue.add(x);
    }
    
    public int pop() {
        rePosition();
        return queue.poll();
    }
    
    public int top() {
        rePosition();
        int result = queue.poll();
        queue.add(result);
        return result;
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }

    public void rePosition(){
        int size = queue.size();
        size--;
        while(size-->0)
            queue.add(queue.poll());
    }
}

20. 有效的括号

题目:20. 有效的括号 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

利用栈的先入后出性质即可解决。

不过要注意栈为空push右括号和最后栈不为空的情况。

代码

时间复杂度:O(n) 空间复杂度:O(n)

java 复制代码
class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            if (cur == '(' || cur == '{' || cur == '[') {
                stack.push(cur);
            } else {
                if (stack.isEmpty()) return false;
                char popChar = stack.pop();
                if ((top == '(' && c != ')')
                 || (top == '{' && c != '}')
                 || (top == '[' && c != ']')) {
                    return false;
                }
            }
        }

        return stack.isEmpty();
    }
}

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

题目:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

利用栈的性质即可解决。

代码

时间复杂度:O(n) 空间复杂度:O(n)

java 复制代码
class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i = 0; i < s.length(); i++){
            char cur = s.charAt(i);
            if(stack.isEmpty()){
                stack.push(cur);
            }else{
                if(stack.peek() == cur){
                    stack.pop();
                }else{
                    stack.push(cur);
                }
            }
        }
        String res = "";
        while(!stack.isEmpty()){
            res = stack.pop().toString() + res;
        }
        return res;
    }
}
相关推荐
QianhangQianping14 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
海绵宝宝转agent19 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
SunnyDays101120 分钟前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word
SunnyDays101122 分钟前
Java 为 Word 添加页码:隐藏封面页码、从指定页开始编号、奇偶页页码设置等
java·word·页码
开源推荐官26 分钟前
多门店 O2O 商城选型复盘:从开发视角对比主流开源系统
java·架构·开源·php
吴名氏.27 分钟前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
从琳开始9891 小时前
从Socket到UDP回显服务器:Java网络编程完整指南
java·网络·网络协议·udp·java-ee
西瓜拿铁好喝2 小时前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库
学长毕设2 小时前
基于SpringBoot的校园礼服租赁系统的设计与实现
java·spring boot·后端
明天也要努力学习2 小时前
深入理解 JVM 垃圾回收(GC)
java·jvm