【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();
}
相关推荐
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1234 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝4 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King5 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家6 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain6 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-07 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20248 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh9 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝