Stack Queue Deque

来源:互联网 发布:淡雅的名字 知乎 编辑:程序博客网 时间:2024/06/07 03:42

Stack Queue Deque

Stack
继承Vector类, 后进先出的值的排列, Stack类是同步的,效率不高。官方一般建议这样使用ArrayDeque代替Stack

常用方法:
empty — 判断stack是否为空
peek — 返回栈顶端的元素
pop — 弹出栈顶的元素,出栈操作只是删除栈顶元素,并不返回该元素,内部执行了 peek(); removeElementAt();两个操作
push — 将元素压入栈
size — 栈中的元素个数
search— 返回最靠近顶端的目标元素到顶端的距离

Queue
java.util.Queue接口,用以支持队列的常见操作,该接口扩展了java.util.Collection接口。
public interface Queue extends Collection { }

除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:
抛出异常(操作失败时)类型: 一般为Collection方法
add(e) — 插入,将指定的元素插入此队列,成功返回true,如果当前无可用空间,则抛出IllegalStateException
remove() — 移出,获取并移除队列的头
element() — 检查,获取但不移除队列的头

返回特殊值(null 或 false,取决于操作)类型:
offer(e) — 插入,将指定的元素插入此队列,如果当前无可用空间,则返回 null
poll() — 移出,获取并移除队列的头,如果此队列为空,则返回null
peek() — 检查,获取但不移除队列的头,如果此队列为空,则返回null

Queue尽量避免使用抛出异常的add()、remove()、element()方法,而是要使用返回特殊值的offer()、poll()、peek()方法,
它们的优点是通过返回值可以判断成功与否,

队列:通常以 FIFO(先进先出)的方式排序各个元素,新元素都插入队列的末尾,移除元素从队列头部移除。
优先级队列:根据提供的比较器或元素的自然顺序对元素进行排序,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列
LIFO队列(堆栈):按 LIFO(后进先出)的方式对元素进行排序。

Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入null。
即使在允许null的实现中,也不应该将null插入到Queue中,因为null也用作poll方法的一个特殊返回值,表明队列不包含元素。

示例:

import java.util.Queue;    import java.util.LinkedList;     public class TestQueue {        public static void main(String[] args) {            Queue<String> queue = new LinkedList<String>(); //LinkedList类实现了Queue接口           queue.offer("how");            queue.offer("are");            queue.offer("you!");            System.out.println(queue.size());            String str;            while((str=queue.poll())!=null){                System.out.print(str);            }            System.out.println();            System.out.println(queue.size());        }    }   

Deque
public interface Deque extends Queue { }
一个线性 collection,支持在两端插入和移除元素。
Deque(double ended queue —双端队列),通常读为“deck”。
Deque既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
Deque是Queue的子接口。
Deque有两个比较重要的类:ArrayDeque和LinkedList
使用栈时: 用ArrayDeque的push和pop方法;
使用队列时: 使用ArrayDeque的add和remove方法。

接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。因为此接口继承了队列接口Queue,
所以其每种方法也存在两种形式:
一种形式在操作失败时抛出异常,
对头:
插入:addFirst(e)
移出:removeFirst()
检查:getFrist()
队尾:
插入:addLast(e)
移出:removeLast()
检查:getLast()

另一种形式返回一个特殊值(null 或 false,具体取决于操作)。
对头:
插入:offerFirst(e)
移出:pollFirst()
检查:peekFrist()
队尾:
插入:offerLast(e)
移出:pollLast()
检查:peekLast()

删除指定元素:
boolean removeFirstOccurrence(e); // 删除队列中第一个出现的
boolean removeLastOccurrence(e); // 删除队列中最后一个出现的e, 如果不存在或者空或其它返回false,成功删除(即改变了队列)则返回true

Deque迭代器:
正向迭代器: dq.iterator
反向迭代器:Iterator descendingIterator(); // 得到Iterator类型的反向迭代器

a、在将双端队列用作队列时,将得到 FIFO(先进先出)行为。
将元素添加到双端队列的末尾,从双端队列的开头移除元素。从Queue接口继承的方法完全等效于Deque方法:
Queue方法 / Dequeue方法
插入:
add(e) / addLast(e) – 插入元素,抛异常
offer(e) / offerLast(e) – 插入元素,如果当前无可用空间,返回null
移出:
remove() / removeFirst() – 获取并移除队列头
poll() / pollFirst() – 获取并移除队列头,如果此队列为空,则返回null
检查:
element() / getFirst() – 获取但不移除队列头
peek() / peekFirst() – 获取但不移除队列头,如果此队列为空,则返回null

b、用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留Stack类。
在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于Deque方法:
堆栈方法 / Dequeue方法
push(e) / addFirst(e) —
pop() / removeFirst() — 获取并移除队列头
peek() / peekFirst() — 获取但不移除队列头
如:

Deque<String> stack = new ArrayDeque<String>();  stack.addFirst("how")stack.addFirst("are")stack.addFirst("you!")System.out.print(stack.removeFirst());System.out.print(stack.removeFirst());System.out.print(stack.removeFirst());

ArrayDeque:
数组实现的Deque,可以指定其capacity,但不过由于双端队列本身数据结构的限制,要求只能在初始化的时候指定capacity,没有像ArrayList那样随时都可以调整的ensureCapacity方法,
构造器中指定其初始的capacity:ArrayDeque(int numElements); // 初始元素个数,默认长度是16
ArrayDeque的使用方法就是上面的Deque的使用方法,基本没有对Deque拓展什么方法;

原创粉丝点击