美文网首页
双端队列、队列

双端队列、队列

作者: 我是小曼巴 | 来源:发表于2020-08-09 16:45 被阅读0次

队列的最大值


public class MaxQueue {

    Queue<Integer> queue;
    Deque<Integer> help; // 使用双端队列, 维护queue的单调序列

    public MaxQueue() {
        queue = new LinkedList<>();
        help = new LinkedList<>();
    }

    public int max_value() {
        if (help.isEmpty()) {
            return -1;
        }
        return help.peekFirst();
    }

    public void push_back(int value) {
        queue.offer(value);
        // 辅助队列保持从大到小, 相等的元素也要保留
        while (!help.isEmpty() && value > help.peekLast()) {
            help.removeLast();
        }
        help.addLast(value);
    }

    // 如果常规队列是空就返回-1, 不然正常返回, 辅助队列需要判断是否是最大值, 是的话就要删除, 但不影响相同最大值
    public int pop_front() {
        if (queue.isEmpty()) {
            return -1;
        }
        int e = queue.remove();
        if (e == help.peekFirst()) {
            help.removeFirst();
        }
        return e;
    }

}

按递增顺序显示卡牌


模拟
    public int[] deckRevealedIncreasing(int[] deck) {
        int N = deck.length;
        Deque<Integer> index = new LinkedList();
        for (int i = 0; i < N; ++i)
            index.add(i);

        int[] ans = new int[N];
        Arrays.sort(deck);
        for (int card: deck) {
            ans[index.pollFirst()] = card;
            if (!index.isEmpty())
                index.add(index.pollFirst());
        }

        return ans;
    }

设计有限阻塞队列

public class BoundedBlockingQueue {

    private int capacity;
    private Queue<Integer> queue;

    public BoundedBlockingQueue(int capacity) {
        this.capacity = capacity;
        this.queue = new LinkedList<>();
    }

    public void enqueue(int element) throws InterruptedException {
        synchronized (queue){
            while (queue.size() == this.capacity){
                queue.wait();
            }
            queue.add(element);
            queue.notifyAll();
        }
    }

    public int dequeue() throws InterruptedException {
        synchronized (queue){
            while (queue.size() == 0){
                queue.wait();
            }
            int ans = queue.poll();
            queue.notifyAll();
            return ans;
        }
    }

    public int size() {
        return queue.size();
    }

}

相关文章

  • 7.双端队列Deque

    目录:1.双端队列的定义2.双端队列的图解3.双端队列定义操作4.双端队列的实现 1.双端队列的定义 2.双端队列...

  • 双端队列

    双端队列 双端队列是与队列类似的项的有序集合。双端队列有两个端部,首部和尾部,并且项在集合中保持不变。双端队不同的...

  • 数据结构-队列(Queue)-FIFO

    数据结构-队列(Queue)-FIFO 队列的接口设计 双端队列-Deque 循环队列-CircleQueue 双...

  • 数据结构与算法之队列(五)

    目录 队列简介队列的接口设计用栈实现队列双端队列实现循环队列实现循环双端队列 一 简介 队列是一种特殊的线性表,只...

  • 队列 - 双端队列 - 循环队列 - 循环双端队列

    队列是一种特殊的线性表,只能在头尾两端进行操作队尾(rear):只能从队尾添加元素,一般叫做 enQueue,入队...

  • 数据结构(四) -- 双端队列

    一,双端队列 队列的一种变型--双端队列(Double-ended queue),简称为Deque。顾名思义,也就...

  • 数据结构之「双端队列」

    什么是双端队列? 双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double...

  • Java中的阻塞队列(1)

    队列(Queue):FIFO 双端队列(Deque):两端都可以进出,当我们约束从队列的一端进出队列时,就形成了一...

  • 4. 数据结构与算法:双端队列-

    双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构。双端队列也拥...

  • 队列和双端队列

    队列 队列是先进先出,比如排队,先排的先得到服务 双端队列 双端队列同时遵守了先进先出和后进先出的原则,可以说它是...

网友评论

      本文标题:双端队列、队列

      本文链接:https://www.haomeiwen.com/subject/wtmjdktx.html