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

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

时间:2022-10-02 17:55:54浏览次数:82  
标签:第十一天 return 队列 随想录 public int stack empty

第一题232.用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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);// 把元素放到入栈里
    }

    public int pop() {
        if(stackOut.empty()){
            //如果stackOut为空的话,把stackIn的元素全部加到stackOut里面
            while (!stackIn.empty()){
                stackOut.push(stackIn.pop());
            }
        }
        Integer res = stackOut.peek();//把要弹出的元素标记为res
        stackOut.pop();//弹出该元素
        return res;
    }

    public int peek() {
        int res = this.pop();//调用弹出函数
        stackOut.push(res);
        return res;
    }

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




第二题225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(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();//队列的大小
        size--;
        while (size-->0){
            queue.addLast(queue.pollFirst());//把要弹出的数前面的数全部弹出后加到队尾
        }
        int res = queue.pollFirst();//给弹出的数赋值
        return res;
    }

    public int top() {
        Integer res = queue.removeLast();//检索并删除队列的最后一个元素
        queue.addLast(res);//再把最后一个元素加到队列尾部
        return res;
    }

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




第三题20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 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;//不成对的直接返回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;// 右括号多
            } else if (!stack.peek().equals(s.charAt(i))) {
                return false;//如果接下来的右括号不是栈顶的元素,返回false
            } else if (stack.peek().equals(s.charAt(i))) {
                stack.pop();//匹配则弹出
            }
        }
        if (!stack.empty()) {
            return false;//左括号多
        }
        return true;
    }
}
  • 三种情况,要么左括号多,要么右括号多,要么左右括号类型不匹配




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

给出由小写字母组成的字符串 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));//栈为空或接下来的元素和栈顶元素不同,元素入栈
            } else {
                stack.pop();//如果接下来的元素和栈顶元素相同的话,栈顶元素出栈
            }
        }
        StringBuilder sb = new StringBuilder();
        while (!stack.empty()) {
            sb.append(stack.pop().charValue());
        }
        return sb.reverse().toString();
    }
}

时间复杂度为O(n)


总结


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

  • 看了一下明天有困难题欸

    标签:第十一天,return,队列,随想录,public,int,stack,empty
    From: https://www.cnblogs.com/xiannveryao/p/16749127.html

相关文章