栈Stack

栈是Vector的一个子类,它实现了一个标准的后进先出的栈。堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。

boolean empty()  //判断栈是否为空
Object peek()    //查看堆栈顶部的对象,但不从堆栈中移除它。
Object pop()     //移除堆栈顶部的对象,并作为此函数的值返回该对象。
Object push(E element) //把项压入堆栈顶部。
int search(Object element)  //返回对象在堆栈中的位置,以 1 为基数。

下面的代码演示了栈的基本用法

   public static void main(String[] args)
   {
        Stack<String> stack = new Stack<String>();

        stack.push("a");
        stack.push("b");
        stack.push("c");
        stack.push("d");
        System.out.println("stack中栈顶的元素: "+ stack.peek());
        System.out.println("stack中b的元素索引: "+ stack.search("b")); 
        while(!stack.empty()){
            System.out.print( stack.pop() + " " );
        }
    }

输出结果为

stack中栈顶的元素: d
stack中b的元素索引: 3
d   c   b   a   

队列 Queue

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
Queue的主要方法如下

boolean add(Object element)    //向队的末尾添加元素,如果队列已满,会抛出异常
boolean offer(Object element)  //相队的末尾添加元素,如果队列已满,返回false,推荐使用

Object remove()                //删除并返回队列头部的元素,如果队列为空抛出异常 
Object poll()                  //删除并返回队列头部的元素,如果队列为空返回null,推荐使用

Object element()               //返回队列头部的元素,如果队列为空抛出异常
Object peek()                  //返回队列头部的元素,如果队列为空返回null,推荐使用

一般队列 Queue

一般队列的示例代码如下

    public static void main(String[] args)
    {
        Queue<String> queueList = new LinkedList<>();
        //使用offer方法
        queueList.offer("a");
        queueList.offer("b");
        queueList.offer("c");
        queueList.offer("d");
        System.out.println("queueList peek 栈顶元素: " + queueList.peek());
        while(!queueList.isEmpty())
        {
            System.out.print( queueList.poll() + " " );
        }
        System.out.println( "\n队列为空 poll " + queueList.poll());
        System.out.println( "队列为空 peek " + queueList.peek());
        //使用add方法
        queueList.add("a");
        queueList.add("b");
        queueList.add("c");
        queueList.add("d");
        System.out.println("queueList element 栈顶元素: " + queueList.element());
        while(!queueList.isEmpty())
        {
            System.out.print( queueList.remove() + " " );
        }
        try {
            System.out.println( "\n队列为空 remove " + queueList.remove());
        }catch(NoSuchElementException e){
            System.out.print("\n队列为空 remove 捕获异常 " );
        }
        try {
            System.out.println( "\n队列为空 element " + queueList.element());
        }catch(NoSuchElementException e){
            System.out.print("\n队列为空 element 捕获异常 " );
        }
    }

输出结果为

queueList peek 栈顶元素: a
a   b   c   d   
队列为空 poll null
队列为空 peek null
queueList element 栈顶元素: a
a   b   c   d   
队列为空 remove  捕获异常   
队列为空 element 捕获异常

双向队列 Deque

Queue接口是单向队列,它有一个子接口Deque,表示双向队列。双向队列的特点是在队列的头部和尾部都可以添加或删除元素。它可以使用new ArrayDeque<>()来初始化,同时LinkedList实现了它的接口,也可使用new LinkedList<>()来初始化。
主要方法如下

//向队列的头部或者尾部添加元素,如果队列已满会抛出异常
void addFirst(Object element)        
void addLast(Object element)    

//向队列的头部或者尾部添加元素,如果队列已满返回false
boolean offerFirst(Object element)   
boolean offerLast(Object element)   

//从头部或尾部删除元素,如果队列为空抛出异常
Object removeFirst()
Object removeLast()

//从头部或尾部删除元素,如果队列为空返回nul
Object pollFirst()
Object pollLast()

//从队列头部或者尾部获取元素,如果队列为空抛出异常
Object getFirst()
Object getLast()

//从队列头部或者尾部获取元素,如果队列为空返回null
Object peekFirst()
Object peekLast()

示例代码

    public static void main(String[] args)
    {
        Deque<String> deque = new ArrayDeque<String>();

        deque.offer("b");
        deque.offerFirst("a");
        deque.offerLast("c");
        deque.offer("d");

        System.out.println("遍历双向队列 " );
        for(String atr : deque)
        {
            System.out.print(atr + " " );
        }
    }

输出结果

遍历双向队列 
a   b   c   d   

优先级队列 PriorityQueue

优先级队列会按照排序的方式对队列中的元素进行排序和检索。因此加入到PriorityQueue中的对象必须实现Comparable接口,提供对元素排序时两个元素之间的比较规则。
示例代码

    public static void main(String[] args)
    {
        Queue<String> priorityQueue = new PriorityQueue<String>();
        priorityQueue.add("c");
        priorityQueue.add("a");
        priorityQueue.add("d");
        priorityQueue.add("b");

        System.out.println("遍历优先级队列 " );
        for(String atr : priorityQueue)
        {
            System.out.print(atr + " " );
        }
        System.out.println("\n依次删除优先级队列中的元素");
        while(!priorityQueue.isEmpty())
        {
            System.out.print(priorityQueue.poll() + " " );
        }
    }

注意的是,用foreach语句遍历优先级队列时,获得元素并没有排序,而在通过poll()或者remove()方法删除元素时,该方法总会删除当前队列中最小的元素。
以上代码输出结果为

遍历优先级队列 
a   b   d   c   
依次删除优先级队列中的元素
a   b   c   d

LinkedList

LinkedList在实现中采用了链表的数据结构,对顺序访问进行了优化,向Lsit中插入和删除元素的速度较快,随机访问则相对较慢。而且LinkedList实现了实现了较多的接口,它可以作为栈、队列和双向队列使用。
示例代码如下

    public static void main(String[] args)
    {
        LinkedList<String> linkList = new LinkedList<>();
        System.out.println("linkList stack: ");

        linkList.push("a");
        linkList.push("b");
        linkList.push("c");
        linkList.push("d");
        while(!linkList.isEmpty())
        {
            System.out.print( linkList.pop() + " " );
        }

        System.out.println();
        System.out.println("linkList queue offer方法: ");
        linkList.offer("a");
        linkList.offer("b");
        linkList.offer("c");
        linkList.offer("d");
        while(!linkList.isEmpty())
        {
            System.out.print( linkList.poll() + " " );
        }

        System.out.println();
        System.out.println("linkList queue add方法: ");
        linkList.add("a");
        linkList.add("b");
        linkList.add("c");
        linkList.add("d");
        while(!linkList.isEmpty())
        {
            System.out.print( linkList.remove() + " " );
        }
    }

输出结果如下

linkList stack: 
d   c   b   a   
linkList queue offer方法: 
a   b   c   d   
linkList queue add方法: 
a   b   c   d