集册 Java实例教程 Queue类表示第一个

Queue类表示第一个

欢马劈雪     最近更新时间:2020-01-02 10:19:05

689
Queue类表示泛型项的先进先出(FIFO)队列。

/******************************************************************************

 *  Copyright 2002-2015, Robert Sedgewick and Kevin Wayne.

 *

 *  This file is part of algs4.jar, which accompanies the textbook

 *

 *      Algorithms, 4th edition by Robert Sedgewick and Kevin Wayne,

 *      Addison-Wesley Professional, 2011, ISBN 0-321-57351-X.

 *      http://algs4.cs.princeton.edu

 *

 *

 *  algs4.jar is free software: you can redistribute it and/or modify

 *  it under the terms of the GNU General Public License as published by

 *  the Free Software Foundation, either version 3 of the License, or

 *  (at your option) any later version.

 *

 *  algs4.jar is distributed in the hope that it will be useful,

 *  but WITHOUT ANY WARRANTY; without even the implied warranty of

 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 *  GNU General Public License for more details.

 *

 *  You should have received a copy of the GNU General Public License

 *  along with algs4.jar.  If not, see http://www.gnu.org/licenses.

 ******************************************************************************/

 /* 来自 n o w j a   v  a . c o m - 时  代  Java*/

/******************************************************************************

 *  Compilation:  javac Queue.java

 *  Execution:    java Queue < input.txt

 *  Dependencies: StdIn.java StdOut.java

 *  Data files:   http://algs4.cs.princeton.edu/13stacks/tobe.txt  

 *

 *  A generic queue, implemented using a linked list.

 *

 *  % java Queue < tobe.txt 

 *  to be or not to be (2 left on queue)

 *

 ******************************************************************************/


package edu.pucit.cs.algo;


import java.util.Iterator;

import java.util.NoSuchElementException;


/**

 *  The <tt>Queue</tt> class represents a first-in-first-out (FIFO)

 *  queue of generic items.

 *  It supports the usual <em>enqueue</em> and <em>dequeue</em>

 *  operations, along with methods for peeking at the first item,

 *  testing if the queue is empty, and iterating through

 *  the items in FIFO order.

 *  <p>

 *  This implementation uses a singly-linked list with a static nested class for

 *  linked-list nodes. See {@link LinkedQueue} for the version from the

 *  textbook that uses a non-static nested class.

 *  The <em>enqueue</em>, <em>dequeue</em>, <em>peek</em>, <em>size</em>, and <em>is-empty</em>

 *  operations all take constant time in the worst case.

 *  <p>

 *  For additional documentation, see <a href="http://algs4.cs.princeton.edu/13stacks">Section 1.3</a> of

 *  <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne.

 *

 *  @author Robert Sedgewick

 *  @author Kevin Wayne

 *

 *  @param <Item> the generic type of an item in this bag

 */

public class Queue<Item> implements Iterable<Item> {

    private Node<Item> first; // beginning of queue

    private Node<Item> last; // end of queue

    private int N; // number of elements on queue


    // helper linked list class

    private static class Node<Item> {

        private Item item;

        private Node<Item> next;
        /* 
        *来 自
         N  o w  J a v a . c o m
        */

    }


    /**

     * Initializes an empty queue.

     */

    public Queue() {

        first = null;

        last = null;

        N = 0;

    }


    /**

     * Returns true if this queue is empty.

     *

     * @return <tt>true</tt> if this queue is empty; <tt>false</tt> otherwise

     */

    public boolean isEmpty() {

        return first == null;

    }


    /**

     * Returns the number of items in this queue.

     *

     * @return the number of items in this queue

     */

    public int size() {

        return N;

    }


    /**

     * Returns the item least recently added to this queue.

     *

     * @return the item least recently added to this queue

     * @throws NoSuchElementException if this queue is empty

     */

    public Item peek() {

        if (isEmpty())

            throw new NoSuchElementException("Queue underflow");

        return first.item;

    }


    /**

     * Adds the item to this queue.

     *

     * @param  item the item to add

     */

    public void enqueue(Item item) {

        Node<Item> oldlast = last;

        last = new Node<Item>();

        last.item = item;

        last.next = null;

        if (isEmpty())

            first = last;

        else

            oldlast.next = last;

        N++;

    }


    /**

     * Removes and returns the item on this queue that was least recently added.

     *

     * @return the item on this queue that was least recently added

     * @throws NoSuchElementException if this queue is empty

     */

    public Item dequeue() {

        if (isEmpty())

            throw new NoSuchElementException("Queue underflow");

        Item item = first.item;

        first = first.next;

        N--;

        if (isEmpty())

            last = null; // to avoid loitering

        return item;

    }


    /**

     * Returns a string representation of this queue.

     *

     * @return the sequence of items in FIFO order, separated by spaces

     */

    public String toString() {

        StringBuilder s = new StringBuilder();

        for (Item item : this)

            s.append(item + " ");

        return s.toString();

    }


    /**

     * Returns an iterator that iterates over the items in this queue in FIFO order.

     *

     * @return an iterator that iterates over the items in this queue in FIFO order

     */

    public Iterator<Item> iterator() {

        return new ListIterator<Item>(first);

    }


    // an iterator, doesn't implement remove() since it's optional

    private class ListIterator<Item> implements Iterator<Item> {

        private Node<Item> current;


        public ListIterator(Node<Item> first) {

            current = first;

        }


        public boolean hasNext() {

            return current != null;

展开阅读全文