java 队列

Queue方法

队列是一种数据结构,它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素。

Queue是java中实现队列的接口,它总共只有6个方法,我们一般只用其中3个就可以了。

Queue的6个方法分类:

    压入元素(添加):add()、offer()
    相同:未超出容量,从队尾压入元素,返回压入的那个元素。
    区别:在超出容量时,add()方法会对抛出异常,offer()返回false

    弹出元素(删除):remove()、poll()
    相同:容量大于0的时候,删除并返回队头被删除的那个元素。
    区别:在容量为0的时候,remove()会抛出异常,poll()返回false

    获取队头元素(不删除):element()、peek()
    相同:容量大于0的时候,都返回队头元素。但是不删除。
    区别:容量为0的时候,element()会抛出异常,peek()返回null。

public class QueueTest {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList();
        queue.offer("元素A");
        queue.offer("元素B");
        queue.offer("元素C");
        queue.offer("元素D");
        queue.offer("元素E");
        while (queue.size() > 0) {
            String element = queue.poll();
            System.out.println(element);
        }
    }
}

Deque

    与 List 接口不同,此接口不支持通过索引访问元素。

双端队列:一个线性 collection,支持在两端插入和移除元素。此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的。

Deque

    与 List 接口不同,此接口不支持通过索引访问元素。

双端队列:一个线性 collection,支持在两端插入和移除元素。此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的。

下表总结了上述 12 种方法:
    第一个元素(头部)    最后一个元素(尾部)
    抛出异常    返回特殊值    抛出异常    返回特殊值
插入    addFirst(e)    offerFirst(e)    addLast(e)    offerLast(e)
删除    removeFirst()    pollFirst()    removeLast()    pollLast()
检查    getFirst()    peekFirst()    getLast()    peekLast()
 

此接口扩展了 Queue 接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于 Deque 方法,如下表所示:

Queue方法等效Deque方法
add(e)addLast(e)
offer(e)offerLast(e)
remove()removeFirst()
poll()pollFirst()
element()getFirst()
peek()peekFirst()

双端队列也可用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于 Deque 方法,如下表所示:

堆栈方法等效Deque方法
push(e)addFirst(e)
pop()removeFirst()
peek()peekFirst()

 

注意,在将双端队列用作队列或堆栈时,peek 方法同样正常工作;无论哪种情况下,都从双端队列的开头抽取元素。

Deque 实现通常不定义基于元素的 equals 和 hashCode 方法,而是从 Object 类继承基于身份的 equals 和 hashCode 方法。
Deque方法

此接口中提供的方法主要有:

     - add(E e) 添加元素至队列的尾部
     - addFirst(E e) 将指定元素插入此双端队列的开头
     - addLast(E e) 将指定元素插入此双端队列的末尾
     - contains(Object o) 如果此双端队列包含指定元素,则返回 true
     - descendingIterator() 返回以逆向顺序在此双端队列的元素上进行迭代的迭代器
     - element() 获取,但不移除此双端队列所表示的队列的头部
     - getFirst() 获取,但不移除此双端队列的第一个元素。
     - getLast() 获取,但不移除此双端队列的最后一个元素。
     - iterator() 返回以恰当顺序在此双端队列的元素上进行迭代的迭代器。
     - offer(E e) 将指定元素插入此双端队列所表示的队列
     - peek() 获取,但不移除此双端队列所表示的队列的头部
     - poll() 获取并移除此双端队列所表示的队列的头部
     - pop() 从此双端队列所表示的堆栈中弹出一个元素
     - push(E e) 将一个元素推入此双端队列所表示的堆栈
     - remove() 获取并移除此双端队列所表示的队列的头部
     - remove(Object o) 从此双端队列中移除第一次出现的指定元素
     - removeFirst() 获取并移除此双端队列第一个元素
     - removeLast() 获取并移除此双端队列的最后一个元素
     - size() 返回此双端队列的元素数

    双端队列的基本方法和 Collection 接口是一样的,如 add(E e) 、contains(Object o)
    、remove(Object o) 、 size()。
    其他方法就是实现双端队列、堆栈的常用方法。

Queue实现类

Queue的实现类有 LinkedList 和 PriorityQueue 。最常用的实现类是 LinkedList 。
LinkedList

LinkedList 类是List接口的实现类,但是同时也是 Deque 接口实现类,所以 LinkedList 既可以当做 双端队列 来使用,也可以当做 栈 来使用。
 

//使用LinkedList模拟队列的存储方式
class TeamList{
        
        LinkedList list;
        
        public TeamList(){
                list = new LinkedList();
        }
        
        public void add(Object o){
                list.offer(o);
        }
        
        public Object remove(){
                return list.poll();
        }
        
        //获取元素个数
        public int size(){
                return list.size();
        }
}

public class Demo9 {
        public static void main(String[] args) {
                TeamList list=  new TeamList();
                list.add("李嘉诚");
                list.add("马云");
                list.add("王健林");
        
                int size = list.size();
                for(int i = 0 ; i<size ; i++){
                        System.out.println(list.remove());
                }
        }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值