algorithm 4th笔记(1.3)

来源:互联网 发布:淘宝设置定时上架 编辑:程序博客网 时间:2024/05/22 17:33

这里先罗列代码,其中Bag,Stack,Queue

  1. 三种数据结构各有各的特点,Bag是无序的,用来存放数据,然后找出满足条件的数据。Stack是先进后出,Queue是先进先出。
  2. 三种数据结构的实现分别有数组实现和链表实现。
  3. 以后补全代码。

Bag

/****************************************************************************** *  Compilation:  javac Bag.java *  Execution:    java Bag < input.txt *  Dependencies: StdIn.java StdOut.java * *  A generic bag or multiset, implemented using a singly-linked list. * *  % more tobe.txt  *  to be or not to - be - - that - - - is * *  % java Bag < tobe.txt *  size of bag = 14 *  is *  - *  - *  - *  that *  - *  - *  be *  - *  to *  not *  or *  be *  to * ******************************************************************************/package edu.princeton.cs.algs4;import java.util.Iterator;import java.util.NoSuchElementException;public class Bag<Item> implements Iterable<Item> {    private Node<Item> first;    // beginning of bag    private int n;               // number of elements in bag    // helper linked list class    private static class Node<Item> {        private Item item;        private Node<Item> next;    }    /**     * Initializes an empty bag.     */    public Bag() {        first = null;        n = 0;    }    /**     * Returns true if this bag is empty.     *     * @return {@code true} if this bag is empty;     *         {@code false} otherwise     */    public boolean isEmpty() {        return first == null;    }    /**     * Returns the number of items in this bag.     *     * @return the number of items in this bag     */    public int size() {        return n;    }    /**     * Adds the item to this bag.     *     * @param  item the item to add to this bag     */    public void add(Item item) {        Node<Item> oldfirst = first;        first = new Node<Item>();        first.item = item;        first.next = oldfirst;        n++;    }    /**     * Returns an iterator that iterates over the items in this bag in arbitrary order.     *     * @return an iterator that iterates over the items in this bag in arbitrary 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;                     }        public void remove()      { throw new UnsupportedOperationException();  }        public Item next() {            if (!hasNext()) throw new NoSuchElementException();            Item item = current.item;            current = current.next;             return item;        }    }    /**     * Unit tests the {@code Bag} data type.     *     * @param args the command-line arguments     */    public static void main(String[] args) {        Bag<String> bag = new Bag<String>();        while (!StdIn.isEmpty()) {            String item = StdIn.readString();            bag.add(item);        }        StdOut.println("size of bag = " + bag.size());        for (String s : bag) {            StdOut.println(s);        }    }}

Stack

/****************************************************************************** *  Compilation:  javac Stack.java *  Execution:    java Stack < input.txt *  Dependencies: StdIn.java StdOut.java *  Data files:   http://algs4.cs.princeton.edu/13stacks/tobe.txt * *  A generic stack, implemented using a singly-linked list. *  Each stack element is of type Item. * *  This version uses a static nested class Node (to save 8 bytes per *  Node), whereas the version in the textbook uses a non-static nested *  class (for simplicity). *   *  % more tobe.txt  *  to be or not to - be - - that - - - is * *  % java Stack < tobe.txt *  to be not that or be (2 left on stack) * ******************************************************************************/package edu.princeton.cs.algs4;import java.util.Iterator;import java.util.NoSuchElementException;public class Stack<Item> implements Iterable<Item> {    private Node<Item> first;     // top of stack    private int n;                // size of the stack    // helper linked list class    private static class Node<Item> {        private Item item;        private Node<Item> next;    }    /**     * Initializes an empty stack.     */    public Stack() {        first = null;        n = 0;    }    /**     * Returns true if this stack is empty.     *     * @return true if this stack is empty; false otherwise     */    public boolean isEmpty() {        return first == null;    }    /**     * Returns the number of items in this stack.     *     * @return the number of items in this stack     */    public int size() {        return n;    }    /**     * Adds the item to this stack.     *     * @param  item the item to add     */    public void push(Item item) {        Node<Item> oldfirst = first;        first = new Node<Item>();        first.item = item;        first.next = oldfirst;        n++;    }    /**     * Removes and returns the item most recently added to this stack.     *     * @return the item most recently added     * @throws NoSuchElementException if this stack is empty     */    public Item pop() {        if (isEmpty()) throw new NoSuchElementException("Stack underflow");        Item item = first.item;        // save item to return        first = first.next;            // delete first node        n--;        return item;                   // return the saved item    }    /**     * Returns (but does not remove) the item most recently added to this stack.     *     * @return the item most recently added to this stack     * @throws NoSuchElementException if this stack is empty     */    public Item peek() {        if (isEmpty()) throw new NoSuchElementException("Stack underflow");        return first.item;    }    /**     * Returns a string representation of this stack.     *     * @return the sequence of items in this stack in LIFO order, separated by spaces     */    public String toString() {        StringBuilder s = new StringBuilder();        for (Item item : this) {            s.append(item);            s.append(' ');        }        return s.toString();    }    /**     * Returns an iterator to this stack that iterates through the items in LIFO order.     *     * @return an iterator to this stack that iterates through the items in LIFO 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;        }        public void remove() {            throw new UnsupportedOperationException();        }        public Item next() {            if (!hasNext()) throw new NoSuchElementException();            Item item = current.item;            current = current.next;             return item;        }    }    /**     * Unit tests the {@code Stack} data type.     *     * @param args the command-line arguments     */    public static void main(String[] args) {        Stack<String> stack = new Stack<String>();        while (!StdIn.isEmpty()) {            String item = StdIn.readString();            if (!item.equals("-"))                stack.push(item);            else if (!stack.isEmpty())                StdOut.print(stack.pop() + " ");        }        StdOut.println("(" + stack.size() + " left on stack)");    }}

Queue

/****************************************************************************** *  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.princeton.cs.algs4;import java.util.Iterator;import java.util.NoSuchElementException;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;    }    /**     * Initializes an empty queue.     */    public Queue() {        first = null;        last  = null;        n = 0;    }    /**     * Returns true if this queue is empty.     *     * @return {@code true} if this queue is empty; {@code false} 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);            s.append(' ');        }        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;                     }        public void remove()      { throw new UnsupportedOperationException();  }        public Item next() {            if (!hasNext()) throw new NoSuchElementException();            Item item = current.item;            current = current.next;             return item;        }    }    /**     * Unit tests the {@code Queue} data type.     *     * @param args the command-line arguments     */    public static void main(String[] args) {        Queue<String> queue = new Queue<String>();        while (!StdIn.isEmpty()) {            String item = StdIn.readString();            if (!item.equals("-"))                queue.enqueue(item);            else if (!queue.isEmpty())                StdOut.print(queue.dequeue() + " ");        }        StdOut.println("(" + queue.size() + " left on queue)");    }}