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

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

package stack;

import java.util.Stack;

public class MyQueue {

    Stack<integer> stackIn;
    Stack<integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }

    public void push(int x) {
        stackIn.push(x);// &#x628A;&#x5143;&#x7D20;&#x653E;&#x5230;&#x5165;&#x6808;&#x91CC;
    }

    public int pop() {
        if(stackOut.empty()){
            //&#x5982;&#x679C;stackOut&#x4E3A;&#x7A7A;&#x7684;&#x8BDD;&#xFF0C;&#x628A;stackIn&#x7684;&#x5143;&#x7D20;&#x5168;&#x90E8;&#x52A0;&#x5230;stackOut&#x91CC;&#x9762;
            while (!stackIn.empty()){
                stackOut.push(stackIn.pop());
            }
        }
        Integer res = stackOut.peek();//&#x628A;&#x8981;&#x5F39;&#x51FA;&#x7684;&#x5143;&#x7D20;&#x6807;&#x8BB0;&#x4E3A;res
        stackOut.pop();//&#x5F39;&#x51FA;&#x8BE5;&#x5143;&#x7D20;
        return res;
    }

    public int peek() {
        int res = this.pop();//&#x8C03;&#x7528;&#x5F39;&#x51FA;&#x51FD;&#x6570;
        stackOut.push(res);
        return res;
    }

    public boolean empty() {
        if(stackIn.empty()&&stackOut.empty()){
            return true;
        } else {
            return false;
        }
    }
}
</integer></integer>

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

package stackandqueue;

import java.util.ArrayDeque;
import java.util.Deque;

public class MyStack {

    Deque<integer> queue;

    public MyStack() {
        queue = new ArrayDeque<>();
    }

    public void push(int x) {
        queue.addLast(x);
    }

    public int pop() {
        int size = queue.size();//&#x961F;&#x5217;&#x7684;&#x5927;&#x5C0F;
        size--;
        while (size-->0){
            queue.addLast(queue.pollFirst());//&#x628A;&#x8981;&#x5F39;&#x51FA;&#x7684;&#x6570;&#x524D;&#x9762;&#x7684;&#x6570;&#x5168;&#x90E8;&#x5F39;&#x51FA;&#x540E;&#x52A0;&#x5230;&#x961F;&#x5C3E;
        }
        int res = queue.pollFirst();//&#x7ED9;&#x5F39;&#x51FA;&#x7684;&#x6570;&#x8D4B;&#x503C;
        return res;
    }

    public int top() {
        Integer res = queue.removeLast();//&#x68C0;&#x7D22;&#x5E76;&#x5220;&#x9664;&#x961F;&#x5217;&#x7684;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x5143;&#x7D20;
        queue.addLast(res);//&#x518D;&#x628A;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x52A0;&#x5230;&#x961F;&#x5217;&#x5C3E;&#x90E8;
        return res;
    }

    public boolean empty() {
        return queue.isEmpty();
    }
}
</integer>
  • 题目本身是不难的,但是我没有用过Deque这个类,还是改了好几遍

给定一个只包括 ‘(‘,’)’,'{‘,’}’,'[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

package stackandqueue;

import java.util.Stack;

public class IsValid {
    public boolean isValid(String s) {
        Stack<character> stack = new Stack<>();
        if (s.length() % 2 != 0) {
            return false;//&#x4E0D;&#x6210;&#x5BF9;&#x7684;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;false
        }
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.push(')');
            } else if (s.charAt(i) == '[') {
                stack.push(']');
            } else if (s.charAt(i) == '{') {
                stack.push('}');
            } else if (stack.empty()) {
                return false;// &#x53F3;&#x62EC;&#x53F7;&#x591A;
            } else if (!stack.peek().equals(s.charAt(i))) {
                return false;//&#x5982;&#x679C;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x53F3;&#x62EC;&#x53F7;&#x4E0D;&#x662F;&#x6808;&#x9876;&#x7684;&#x5143;&#x7D20;&#xFF0C;&#x8FD4;&#x56DE;false
            } else if (stack.peek().equals(s.charAt(i))) {
                stack.pop();//&#x5339;&#x914D;&#x5219;&#x5F39;&#x51FA;
            }
        }
        if (!stack.empty()) {
            return false;//&#x5DE6;&#x62EC;&#x53F7;&#x591A;
        }
        return true;
    }
}
</character>
  • 三种情况,要么左括号多,要么右括号多,要么左右括号类型不匹配

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

ψ(`∇´)ψ 我的思路

  • 今天独立完成的第一道题,解题思路与上一题相似,但比上一题简单
  • 读题后的第一想法是字符串对称,但是实现非常困难,栈的结构就很巧妙的解决这个问题
package stackandqueue;

import java.util.Stack;

public class RemoveDuplicates {

    public static String removeDuplicates(String s) {
        Stack<character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (stack.empty()||!(stack.peek().equals(s.charAt(i)))){
                stack.push(s.charAt(i));//&#x6808;&#x4E3A;&#x7A7A;&#x6216;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x5143;&#x7D20;&#x548C;&#x6808;&#x9876;&#x5143;&#x7D20;&#x4E0D;&#x540C;&#xFF0C;&#x5143;&#x7D20;&#x5165;&#x6808;
            } else {
                stack.pop();//&#x5982;&#x679C;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x5143;&#x7D20;&#x548C;&#x6808;&#x9876;&#x5143;&#x7D20;&#x76F8;&#x540C;&#x7684;&#x8BDD;&#xFF0C;&#x6808;&#x9876;&#x5143;&#x7D20;&#x51FA;&#x6808;
            }
        }
        StringBuilder sb = new StringBuilder();
        while (!stack.empty()) {
            sb.append(stack.pop().charValue());
        }
        return sb.reverse().toString();
    }
}
</character>

时间复杂度为O(n)

总结

  • 今天前三道题都不是自己做出来的,主要还是对栈和队列的用法不熟悉,不知道该往哪个地方想,做到后面就好一点

  • 看了一下明天有困难题欸😍,小刘小刘,加油加油!!!

Original: https://www.cnblogs.com/xiannveryao/p/16749127.html
Author: nnn~
Title: 代码随想录第十一天 | 232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/604813/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球