结合栈与队列,请详细说一下Deque都有什么方法:
Deque
接口(Double Ended Queue,双端队列)提供了一系列方法,既可以用作栈,也可以用作队列。下面是 Deque
接口中常用的方法:
-
栈操作方法:
void push(E e)
: 将元素推入栈顶。E pop()
: 弹出栈顶元素,并将其从栈中移除。E peek()
: 获取栈顶元素,但不移除它。
-
队列操作方法:
void addFirst(E e)
: 将元素插入到队列的开头。void addLast(E e)
: 将元素插入到队列的末尾。boolean offerFirst(E e)
: 将元素插入到队列的开头,如果成功则返回 true。boolean offerLast(E e)
: 将元素插入到队列的末尾,如果成功则返回 true。E removeFirst()
: 移除并返回队列开头的元素。E removeLast()
: 移除并返回队列末尾的元素。E pollFirst()
: 移除并返回队列开头的元素,如果队列为空则返回 null。E pollLast()
: 移除并返回队列末尾的元素,如果队列为空则返回 null。E getFirst()
: 获取队列开头的元素,但不移除它。E getLast()
: 获取队列末尾的元素,但不移除它。E peekFirst()
: 获取队列开头的元素,如果队列为空则返回 null。E peekLast()
: 获取队列末尾的元素,如果队列为空则返回 null。
-
其他常用方法:
boolean isEmpty()
: 判断队列是否为空。int size()
: 返回队列中的元素数量。void clear()
: 清空队列中的所有元素。
这些方法允许你在 Deque
对象上实现栈和队列的操作。你可以根据需要选择合适的方法来实现特定的功能。
需要注意的是,Deque
是一个接口,它有多个具体实现类,例如 ArrayDeque
和 LinkedList
。你可以根据实际需求选择适合的实现类来创建 Deque
对象。
ArrayDeque<Integer>
是 Deque<Integer>
的一个具体实现类。它提供了双端队列的功能,并使用数组作为内部数据结构。
由于之前出现了混淆,以下是正确的区别:
-
继承关系:
ArrayDeque<Integer>
实现了Deque<Integer>
接口。因此,它支持Deque
接口中定义的所有方法,包括栈和队列的操作。 -
内部数据结构:
ArrayDeque<Integer>
使用循环数组(circular array)作为内部数据结构。这种数据结构允许在两端进行高效的插入和删除操作,使其既可以用作栈,也可以用作队列。 -
动态扩容:
ArrayDeque<Integer>
的内部数组会根据需要进行动态扩容,以容纳更多的元素。它具有自动调整容量的能力,可以根据实际需求进行扩展,而不受固定容量的限制。 -
线程安全性:
ArrayDeque<Integer>
不是线程安全的,它不提供多线程并发访问的保护机制。如果在多线程环境中使用ArrayDeque<Integer>
,需要采取适当的同步措施来确保线程安全性。
因此,ArrayDeque<Integer>
是 Deque<Integer>
接口的一个具体实现类,它使用循环数组作为内部数据结构,提供了双端队列的功能。你可以使用 ArrayDeque<Integer>
来创建一个双端队列,并根据需要执行栈和队列的操作。