代码随想录算法训练营,9月6日 | 232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项

栈与队列理论基础
1.队列是先进先出,栈是先进后出
2.队列:
主要操作:
offer(): 向队列尾部添加元素。
poll(): 从队列头部移除并返回元素。
peek(): 查看队列头部的元素但不移除。
实现: 在Java中可以使用 java.util.Queue 接口的实现类(如 LinkedList、PriorityQueue 和 ArrayDeque)来使用队列。
3.栈:
主要操作:
push(): 将一个元素压入栈顶。
pop(): 从栈顶弹出一个元素。
peek(): 查看栈顶的元素但不弹出。
实现: 在Java中可以使用 java.util.Stack 类或使用 Deque 接口的实现(如 LinkedList、ArrayDeque)来模拟栈的行为。Stack 类比较老旧,不推荐使用,Deque 更灵活且高效。

232.用栈实现队列
题目链接:232.用栈实现队列
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰用栈实现队列
日期:2024-09-06

想法:新建两个栈,入队列直接push元素到stIn里,出队列,如果stOut为空,就先将stIn的元素全push进stOut,stOut出一个元素,不为空直接出,队列为空,两个栈为空。
Java代码如下:

class MyQueue {
    Stack<Integer> stIn;
    Stack<Integer> stOut;
    public MyQueue() {
        stIn = new Stack<>();
        stOut = new Stack<>();
    }
    
    public void push(int x) {
        stIn.push(x);
    }
    
    public int pop() {
        if(!stOut.isEmpty()) return stOut.pop();
        else{
            while(!stIn.empty()){
                stOut.push(stIn.pop());
            }
        }
        return stOut.pop();
    }
    
    public int peek() {
        if(!stOut.isEmpty()) return stOut.peek();
        else{
            while(!stIn.empty()){
                stOut.push(stIn.pop());
            }
        }
        return stOut.peek();
    }
    
    public boolean empty() {
        return stIn.isEmpty() && stOut.isEmpty();
    }
}

225. 用队列实现栈
题目链接:225. 用队列实现栈
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰用队列实现栈
日期:2024-09-06

想法:可以用一个队列来实现,push操作就正常入,pop的话将队列里除最后一个的元素全部重新加到队列,然后poll出的值就是pop的值了,top也是同样想法,empty判一下空。
Java代码如下:

class MyStack {
    Queue<Integer> que;
    public MyStack() {
        que = new LinkedList<>();
    }
    
    public void push(int x) {
        que.offer(x);
    }
    
    public int pop() {
        rePosition();
        return que.poll();
    }
    
    public int top() {
        rePosition();
        int res = que.poll();
        que.offer(res);
        return res;
    }
    
    public boolean empty() {
        return que.isEmpty();
    }

    private void rePosition(){
        int size = que.size();
        size--;
        while (size-- > 0) {
            que.offer(que.poll());
        }
    }
}

总结:top的时候没注意如果将队列顺序改了,再peek是不能实现只查不改的,这时要还原下队列,将top的那个值再塞回队列即可。

20. 有效的括号
题目链接:20. 有效的括号
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰有效的括号
日期:2024-09-06

想法:匹配类型题考虑用栈,第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
Java代码如下:

class Solution {
    public boolean isValid(String s) {
        Stack<Character> st = new Stack<>();
        char[] ch = s.toCharArray();
        for (int i = 0; i < s.length(); i++){
            if (ch[i] == '('){
                st.push(')');
            }else if (ch[i] == '['){
                st.push(']');
            }else if (ch[i] == '{'){
                st.push('}');
            }else if (st.isEmpty() || st.peek() != ch[i]){
                return false;
            }else {
                st.pop();
            }
        }
        return st.isEmpty();
    }
}

总结:要熟悉这种匹配模式的各种边界判定。

1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰删除字符串中的所有相邻重复项
日期:2024-09-06

想法:用栈来存字符串中的元素,栈顶遇到相同的就删,剩下的元素如果是依次pop出就是倒序的,每一次将输出的加在最前面即可
Java代码如下:

class Solution {
    public String removeDuplicates(String s) {
        ArrayDeque<Character> deque = new ArrayDeque<>();
        char c;
        for(int i = 0; i < s.length(); i++){
            c = s.charAt(i);
            if(deque.isEmpty() || deque.peek() != c){
                deque.push(c);
            }else{
                deque.pop();
            }
        }
        String str = "";
        while (!deque.isEmpty()) {
            str = deque.pop() + str;
        }
        return str;
    }
}

总结:Java中用ArrayDeque的情况较多,但也要注意跟LinkedList的区别,参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist

posted @   漪欢酒  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示