首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在删除优先级队列的尾部元素

正在删除优先级队列的尾部元素
EN

Stack Overflow用户
提问于 2013-02-28 00:31:21
回答 8查看 25K关注 0票数 8

如何删除优先级队列的尾部元素?我正在尝试使用优先级队列实现波束搜索,一旦优先级队列满了,我想删除最后一个元素(具有最低优先级的元素)。

谢谢!

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-02-28 00:44:55

没有简单的方法。将图元从原始复制到新的,最后一个除外。

代码语言:javascript
复制
PriorityQueue removelast(PriorityQueue pq)
{

    PriorityQueue pqnew;

    while(pq.size() > 1)
    {
        pqnew.add(pq.poll());
    }

    pq.clear();
    return pqnew;
}

调用为

代码语言:javascript
复制
pq = removelast(pq);
票数 6
EN

Stack Overflow用户

发布于 2013-02-28 01:14:00

您可能可以使用Guava的MinMaxPriorityQueue来完成此任务。它为队列两端提供了peek、poll和remove方法。

另一种选择是编写一个队列包装器来强制绑定,类似于this answer。您需要实现offeraddaddAll来检查容量。类似于:

代码语言:javascript
复制
public class BoundedQueue<E> implements Serializable, Iterable<E>, Collection<E>, Queue<E> {
    private final Queue<E> queue;
    private int capacity;

    public BoundedQueue(Queue<E> queue, int capacity) {
        this.queue = queue;
        this.capacity = capacity;
    }

    @Override
    public boolean offer(E o) {
        if (queue.size() >= capacity)
            return false;
        return queue.add(o);
    }

    @Override
    public boolean add(E o) throws IllegalStateException {
        if (queue.size() >= capacity)
            throw new IllegalStateException("Queue full"); // same behavior as java.util.ArrayBlockingQueue
        return queue.add(o);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        boolean changed = false;
        for (E o: c)
            changed |= add(o);
        return changed;
    }

    // All other methods simply delegate to 'queue'
}
票数 6
EN

Stack Overflow用户

发布于 2013-02-28 06:17:35

使用倒置比较器,从头上取下。如果你同时需要头部和尾部,那么你使用了错误的数据结构。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15117246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档