Java-queue(队列)与deque(双端队列)

651 阅读2分钟

Queue:

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

import java.util.LinkedList;
import java.util.Queue;
 
public class Main {
    public static void main(String[] args) {
        //add()和remove()方法在失败的时候会抛出异常(不推荐)
        Queue<String> queue = new LinkedList<String>();
        //添加元素
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d");
        queue.offer("e");
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("element="+queue.element()); //返回第一个元素 
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("peek="+queue.peek()); //返回第一个元素 
        for(String q : queue){
            System.out.println(q);
        }
    }
}

Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。

下表显示了jdk1.5中的阻塞队列的操作:

add

增加一个元索

如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove

移除并返回队列头部的元素

如果队列为空,则抛出一个NoSuchElementException异常
element

返回队列头部的元素

如果队列为空,则抛出一个NoSuchElementException异常
offer

添加一个元素并返回true

如果队列已满,则返回false
poll

移除并返问队列头部的元素

如果队列为空,则返回null
peek

返回队列头部的元素

如果队列为空,则返回null
put

添加一个元素

如果队列满,则阻塞
take

移除并返回队列头部的元素

如果队列为空,则阻塞

Deque:

 deque(也称为双端队列)是与队列类似的项的有序集合。它有两个端部,首部和尾部,并且项在集合中保持不变。deque 不同的地方是添加和删除项是非限制性的。可以在前面或后面添加新项。同样,可以从任一端移除现有项。如下展示了一个 Python 数据对象的 deque 。

from python_basic_deque.deque_definition import Deque

# 新建一个deque队列
d = Deque()

# 判断队列是否为空
print(d.isEmpty())

# 在队头添加元素1,并查看该队列
d.addFront(1)
print(d.list1())

# 在队头添加元素2,并查看该队列
d.addFront(2)
print(d.list1())

# 在队头添加元素3,并查看该队列
d.addFront(3)
print(d.list1())

# 在队尾添加元素4,并查看该队列
d.addRear(4)
print(d.list1())

# 在队尾添加元素5,并查看该队列
d.addRear(5)
print(d.list1())

# 队列大小为,判断是否为空
print(d.size())
print(d.isEmpty())

# 移除队头
d.removeFront()
print(d.list1())

# 移除队尾
d.removeRear()
print(d.list1())
//by dongge-destiny