stack,deque,queue对比

    xiaoxiao2026-09-10  2

    1.stack堆栈,没有迭代器,支持push()方法。后进先出,top()返回最顶端的元素,pop()剔除最顶元素,后进先出(LIFO);

    2.deque双端队列,支持迭代器,有push_back()方法,跟vector差不多,比vector多了个pop_front,push_front方法;

    3.queue队列,先进先出,不支持迭代器队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素Queue使用时要尽量避免Collection的add()和remove()方法而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。

    Stack的例子:

    public static void main(String[] args) { Stack st = new Stack(); System.out.println("st的hashCode:"+st.hashCode()); st.push("wce"); st.push(12.8f); st.push(true); System.out.println(st); System.out.println(st.peek()+"--------"); // System.out.println(st.empty()); System.out.println(st.search("wce")); st.pop(); System.out.println(st); }

    队列Queue、双端队列Deque

    注意:这都只是接口而已

     

    1、Queue

    API

    在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。

     

    Java代码   public interface Queue<E>        extends Collection<E>  

     除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。

     

    每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。

     

    队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。

    在 FIFO 队列中,所有的新元素都插入队列的末尾,移除元素从队列头部移除。

     

    Queue使用时要尽量避免Collection的add()和remove()方法而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。

     

    offer 方法可插入一个元素,否则返回 false。这与 Collection.add 方法不同,该方法只能通过抛出未经检查的异常使添加元素失败。

    remove() 和 poll() 方法可移除和返回队列的头。到底从队列中移除哪个元素是队列排序策略的功能,而该策略在各种实现中是不同的。remove() 和 poll() 方法仅在队列为空时其行为有所不同:remove() 方法抛出一个异常,而 poll() 方法则返回 null。

    element() 和 peek() 返回,但不移除,队列的头。

     

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

     

    值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

    Java代码   import java.util.Queue;     import java.util.LinkedList;        public class TestQueue {         public static void main(String[] args) {             Queue<String> queue = new LinkedList<String>();             queue.offer("Hello");             queue.offer("World!");             queue.offer("你好!");             System.out.println(queue.size());             String str;             while((str=queue.poll())!=null){                 System.out.print(str);             }             System.out.println();             System.out.println(queue.size());         }     }   

     

    public static void main(String[] args) { Queue<Object> queue = new LinkedList<Object>(); queue.offer("Hello"); queue.offer("World!"); queue.add("你好!"); queue.add(false); queue.remove(); System.out.println(queue.size()); System.out.println(queue.peek()); System.out.println(queue.element()+"--------"); Object str; while((str=queue.poll())!=null){ System.out.println(str); } System.out.println(queue.size()); }

     

    2、Deque

    API 

    Java代码   public interface Deque<E>       extends Queue<E>  

     一个线性 collection,支持在两端插入和移除元素。

    名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。

    大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

     

    此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。因为此接口继承了队列接口Queue,所以其每种方法也存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。

     

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

     

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

    public static void main(String[] args) { Deque<Object> d = new LinkedList<Object>(); d.addFirst("ads"); d.addFirst(234.4f); d.offerFirst(true); d.offerFirst('e'); d.addLast(false);; d.addLast(982l); d.offerLast("rv"); d.offerLast(9); d.offerLast("oiu"); System.out.println(d); d.removeFirst(); System.out.println(d+"---1-"); d.pollFirst(); System.out.println(d+"---2-"); d.removeLast(); System.out.println(d+"---3-"); d.pollLast(); System.out.println(d+"---4-"); System.out.println(d.getFirst()+"---5-"); System.out.println(d.peekFirst()+"---6-"); System.out.println(d.getLast()+"---7-"); System.out.println(d.peekLast()+"---8-"); System.out.println(d+"---9-"); }运行结果:

    [e, true, 234.4, ads, false, 982, rv, 9, oiu] [true, 234.4, ads, false, 982, rv, 9, oiu]---1- [234.4, ads, false, 982, rv, 9, oiu]---2- [234.4, ads, false, 982, rv, 9]---3- [234.4, ads, false, 982, rv]---4- 234.4---5- 234.4---6- rv---7- rv---8- [234.4, ads, false, 982, rv]---9-

    转载请注明原文地址: https://ju.6miu.com/read-1311944.html
    最新回复(0)