代码随想录:栈与队列01

代码随想录打卡博客

用栈实现队列

本题的思路是使用两个栈来实现队列,其中一个栈用来数据in,另一个栈用于数据out。当in栈中有数据而out栈中没有数据时,需要出栈的情况,要把in栈中所有数据push到out栈中,然后出栈。peek同理。

代码如下:

import java.util.Stack;

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() {
        dumpStackIn();
        return stackOut.pop();
    }
    
    public int peek() {
        dumpStackIn();
        return stackOut.peek();
    }
    
    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }
    public void dumpStackIn(){
        if(!stackOut.isEmpty()) return;
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}

用队列实现栈

本体思路,使用一个队列来实现栈。关键是怎么实现先进后出,当需要出栈的时候,将队尾元素前的元素出队列在进队列,然后弹出即可。

代码如下:

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

class MyStack {
    Deque<Integer> queue ;
    public MyStack() {
        queue = new ArrayDeque<>();
    }
    
    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());
        }
    }
}

有效的括号

本题思路就是通过栈的应用来解决括号的匹配。不匹配的情况共有三种,左括号多了、右括号多了、括号不匹配。那么我们在遍历字符串的时候,遇到左括号就将它对应的右括号存储进栈,然后遇到对应的右括号出栈,当不匹配,或者栈空了的时候就失败。

代码如下:

import java.util.Stack;

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

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

本题也是栈的应用,通过本题理解了栈确实可以用于消除的操作,因为栈可以查看上一个元素是什么。本题如果为空或者不等就入栈,相等就出栈。最后将栈的元素转移到字符串中就可以了。

代码如下:

import java.util.Stack;

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

今日八股

  1. MySQL和Redis的区别是什么
  2. Redis的优缺点,为什么Redis的查询速度会比较快

今日其他

完成了skiplist的删除以及打印

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值