【leetcode】第五章 栈与队列part02

232.用栈实现队列

  • 用两个栈来实现
  • 当pop时,检测out栈是否为空,若为空,则将in栈的元素全都放入out栈中
java 复制代码
class MyQueue {

    private Stack<Integer> in;
    private Stack<Integer> out;

    public MyQueue() {
        in = new Stack<>();
        out = new Stack<>();
    }

    public void push(int x) {
        in.push(x);
    }

    public int pop() {

        if (out.isEmpty()) {
            while (!in.isEmpty()) {
                out.push(in.pop());
            }
        }
        return out.pop();
    }

    public int peek() {
        if (out.isEmpty()) {
            while (!in.isEmpty()) {
                out.push(in.pop());
            }
        }
        return out.peek();
    }

    public boolean empty() {
        return in.isEmpty() && out.isEmpty();
    }
}

225. 用队列实现栈

  • 单个队列方法
  • 将前面n-1个元素弹出并加入底部,这样就可以模拟后进先出
java 复制代码
class MyStack {
    // 用单个队列
    // 将前面n-1个元素弹出并加入底部
    private Queue<Integer> a;

    public MyStack() {
        a = new LinkedList<>();
    }
    
    public void push(int x) {
        // size-1
        int n = a.size();
        a.offer(x);
        while (n > 0) {
            a.offer(a.poll());
            n--;
        }
    }
    
    public int pop() {
        return a.poll();
    }
    
    public int top() {
        return a.peek();
    }
    
    public boolean empty() {
        return a.isEmpty();
    }
}

20. 有效的括号

java 复制代码
public boolean isValid(String s) {
    // 输入:s = "()[]{}"
    //输出:true
    HashMap<Character,Character> map = new HashMap<>();
    map.put('(',')');
    map.put('[',']');
    map.put('{','}');

    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (ch == '(' || ch == '{' || ch == '[') {
            stack.push(map.get(ch));
        }
        // [()]
        // ])
        else if (stack.isEmpty() || ch != stack.pop()) {
            return false;
        }
    }
    // ([
    return stack.isEmpty();
}
  • Deque和Stack
java 复制代码
public boolean isValid(String s) {
    // 输入:s = "()[]{}"
    //输出:true
    HashMap<Character,Character> map = new HashMap<>();
    map.put('(',')');
    map.put('[',']');
    map.put('{','}');

    Deque<Character> stack = new LinkedList<>();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (ch == '(' || ch == '{' || ch == '[') {
            stack.push(map.get(ch));
        }
        // [()]
        // ])
        else if (stack.isEmpty() || ch != stack.pop()) {
            return false;
        }
    }
    // ([
    return stack.isEmpty();
}

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

  • 要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么
java 复制代码
public String removeDuplicates(String s) {
    // 输入:"abbaca"
    //输出:"ca"
    Deque<Character> stack = new LinkedList<>();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (stack.isEmpty()) {
            stack.push(ch);
            continue;
        } else if (ch == stack.peek()) {
            stack.pop();
            continue;
        }
        stack.push(ch);

    }
    StringBuilder sb = new StringBuilder();
    while (!stack.isEmpty()) {
        sb.append(stack.pop());
    }
    return sb.reverse().toString();
}

150. 逆波兰表达式求值

java 复制代码
public static int evalRPN(String[] tokens) {
    Deque<Integer> stack = new LinkedList<>();
    for (String token : tokens) {

        switch (token){
            case "+":
                stack.push(stack.pop()+stack.pop());
                break;
            case "-":
                stack.push(-1*(stack.pop()-stack.pop()));
                break;
            case "*":
                stack.push(stack.pop()*stack.pop());
                break;
            case "/":
                int a = stack.pop();
                int b = stack.pop();
                stack.push(b/a);
                break;
            default:
                stack.push(Integer.parseInt(token));
        }

    }
    return stack.pop();
}
相关推荐
BlockChain8886 分钟前
AI+区块链深度探索:算法与账本的共生时代
人工智能·算法·区块链
生成论实验室16 分钟前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》第一章 源:不可言说的生成之源
人工智能·科技·算法·生活·创业创新
2zcode41 分钟前
基于低光照增强与轻量型CNN道路实时识别算法研究(UI界面+数据集+训练代码)
人工智能·算法·cnn·低光照增强·自动驾驶技术
小雅痞1 小时前
[Java][Leetcode middle] 209. 长度最小的子数组
java·算法·leetcode
做时间的朋友。1 小时前
精准核酸检测
java·数据结构·算法
冯诺依曼的锦鲤1 小时前
从零实现高并发内存池:TCMalloc 核心架构拆解
c++·学习·算法·架构
Thomas_Lee_OR2 小时前
多Agent路径规划 LaCAM for multi-agent path finding (MAPF)
算法·路径规划·仓储机器人·mapf
一切皆是因缘际会2 小时前
可落地数字生命工程:从记忆厮杀到自我意识觉醒全链路,AGI内生智能硅基生命心智建模
人工智能·深度学习·算法·机器学习·ai·系统架构·agi
nlpming2 小时前
opencode Agent 详解
算法
江南十四行2 小时前
排序算法进阶:直接插入排序(简单排序)与希尔排序
数据结构·算法·排序算法