<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chan Chen Coding...

    Bag Queue and Stack

    Several fundamental data types involve collections of objects. Specifically, the set of values is a collection of objects, and the operations revolve around adding, removing, or examining objects in the collection. In this section, we consider three such data types, known as the bag, the queue, and the stack. They differ in the specification of which object is to be removed or examined next.

    APIs.

     We define the APIs for bags, queues, and stacks. Beyond the basics, these APIs reflect two Java features: generics and iterable collections.APIs for bag, queue, and stack

    • Generics. An essential characteristic of collection ADTs is that we should be able to use them for any type of data. A specific Java mechanism known as generics enables this capability. The notation <Item> after the class name in each of our APIs defines the name Item as a type parameter, a symbolic placeholder for some concrete type to be used by the client. You can read Stack<Item> as "stack of items." For example, you can write code such as
      Stack<String> stack = new Stack<String>(); 
      stack.push("Test");
      ...
      String next = stack.pop();
      to use a stack for String objects.

    • Autoboxing. Type parameters have to be instantiated as reference types, so Java automatically converts between a primitive type and its corresponding wrapper type in assignments, method arguments, and arithmetic/logic expressions. This conversion enables us to use generics with primitive types, as in the following code:
      Stack<Integer> stack = new Stack<Integer>(); stack.push(17);
      // auto-boxing (int -> Integer) int i = stack.pop();
      // auto-unboxing (Integer -> int)
      Automatically casting a primitive type to a wrapper type is known as autoboxing, and automatically casting a wrapper type to a primitive type is known as auto-unboxing.

    • Iterable collections. For many applications, the client's requirement is just to process each of the items in some way, or to iterate through the items in the collection. Java's foreach statement supports this paradigm. For example, suppose that collection is a Queue<Transaction>. Then, if the collection is iterable, the client can print a transaction list with a single statement:
      for (Transaction t : collection)
      StdOut.println(t);

    • Bags. A bag is a collection where removing items is not supported—its purpose is to provide clients with the ability to collect items and then to iterate through the collected items. Stats.java is a bag client that reads a sequence of real numbers from standard input and prints out their mean and standard deviation.

    • FIFO queues. A FIFO queue is a collection that is based on the first-in-first-out (FIFO) policy. The policy of doing tasks in the same order that they arrive server is one that we encounter frequently in everyday life: from people waiting in line at a theater, to cars waiting in line at a toll booth, to tasks waiting to be serviced by an application on your computer.

    • Pushdown stack. A pushdown stack is a collection that is based on the last-in-first-out (LIFO) policy. When you click a hyperlink, your browser displays the new page (and pushes onto a stack). You can keep clicking on hyperlinks to visit new pages, but you can always revisit the previous page by clicking the back button (popping it from the stack). Reverse.java is a stack client that reads a sequence of integers from standard input and prints them in reverse order.

    • Arithmetic expression evaluation. Evaluate.java is a stack client that evaluates fully parenthesized arithmetic expressions. It uses Dijkstra's 2-stack algorithm:
      • Push operands onto the operand stack.
      • Push operators onto the operator stack.
      • Ignore left parentheses.
      • On encountering a right parenthesis, pop an operator, pop the requisite number of operands, and push onto the operand stack the result of applying that operator to those operands.

      This code is a simple example of an interpreter.

    Array and resizing array implementations of collections.

    • Fixed-capacity stack of strings. FixedCapacityStackOfString.java implements a fixed-capacity stack of strings using an array.

    • Fixed-capacity generic stack. FixedCapacityStack.java implements a generic fixed-capacity stack.

    • Array resizing stack. ResizingArrayStack.java implements a generic stack using a resizing array. With a resizing array, we dynamically adjust the size of the array so that it is both sufficiently large to hold all of the items and not so large as to waste an excessive amount of space. Wedouble the size of the array in push() if it is full; we halve the size of the array in pop() if it is less than one-quarter full.

    • Array resizing queue. ResizingArrayQueue.java implements the queue API with a resizing array.

    Linked lists.

     A linked list is a recursive data structure that is either empty (null) or a reference to a node having a generic item and a reference to a linked list. To implement a linked list, we start with a nested class that defines the node abstraction
    private class Node {
    Item item;
    Node next;
    }

    • Building a linked list. To build a linked list that contains the items tobe, and or, we create a Node for each item, set the item field in each of thbuilding a linked list

    • Insert at the beginning. The easiest place to insert a new node in a linked list is at the beginning.inserting a new node at the beginning of a linked list

    • Remove from the beginning. Removing the first node in a linked list is also easy.
      removing the first node in a linked list

    • Insert at the end. To insert a node at the end of a linked list, we maintain a link to the last node in the list.inserting a node at the end of a linked list

    • Traversal. The following is the idiom for traversing the nodes in a linked list.
      for (Node x = first; x != null; x = x.next) {
      // process x.item
      }

    Linked-list implementations of collections.

    • Linked list implementation of a stack. Stack.java implements a generic stack using a linked list. It maintains the stack as a linked list, with the top of the stack at the beginning, referenced by an instance variable first. To push() an item, we add it to the beginning of the list; to pop()an item, we remove it from the beginning of the list.

    • Linked list implementation of a queue. Program Queue.java implements a generic FIFO queue using a linked list. It maintains the queue as a linked list in order from least recently to most recently added items, with the beginning of the queue referenced by an instance variable firstand the end of the queue referenced by an instance variable last. To enqueue() an item, we add it to the end of the list; to dequeue() an item, we remove it from the beginning of the list.

    • Linked list implementation of a bag. Program Bag.java implements a generic bag using a linked list. The implementation is the same as Stack.javaexcept for changing the name of push() to add() and removing pop().

    Iteration.

     To consider the task of implementing iteration, we start with a snippet of client code that prints all of the items in a collection of strings, one per line:
    Stack<String> collection = new Stack<String>(); 
    ...
    for (String s : collection)
    StdOut.println(s);
       ...
    This foreach statement is shorthand for the following while statement:
    Iterator<String> i = collection.iterator(); 
    while (i.hasNext()) {
    String s = i.next();
    StdOut.println(s);
    }
    To implement iteration in a collection:

    • Include the following import statement so that our code can refer to Java's java.util.Iterator interface:
      import java.util.Iterator; 

    • Add the following to the class declaration, a promise to provide an iterator() method, as specified in the java.lang.Iterable interface:
      implements Iterable<Item> 

    • Implement a method iterator() that returns an object from a class that implements the Iterator interface:
      public Iterator<Item> iterator() {
      return new ListIterator();
      }

    • Implement a nested class that implements the Iterator interface by including the methods hasNext()next(), and remove(). We always use an empty method for the optional remove() method because interleaving iteration with operations that modify the data structure is best avoided.

      • The nested class ListIterator in Bag.java illustrates how to implement a class that implements the Iterator interface when the underlying data structure is a linked list.

      • The nested class ArrayIterator in ArrayResizingBag.java does the same when the underlying data structure is an array.


    Autoboxing Q + A

    Q. How does auto-boxing handle the following code fragment?

    Integer a = null; int b = a; 

    A. It results in a run-time error. Primitive type can store every value of their corresponding wrapper type except null.

    Q. Why does the first group of statements print true, but the second false?

    Integer a1 = 100;
    Integer a2 = 100;
    System.out.println(a1 == a2);
    // true Integer b1 = new Integer(100);
    Integer b2 = new Integer(100);
    System.out.println(b1 == b2);
    // false Integer c1 = 150;
    Integer c2 = 150;
    System.out.println(c1 == c2);
    // false

    A. The second prints false because b1 and b2 are references to different Integer objects. The first and third code fragments rely on autoboxing. Surprisingly the first prints true because values between -128 and 127 appear to refer to the same immutable Integer objects (Java's implementation of valueOf() retrieves a cached values if the integer is between -128 and 127), while Java constructs new objects for each integer outside this range.

    Here is another Autoboxing.java anomaly.

    Generics Q + A

    Q. Are generics solely for auto-casting?

    A. No, but we will use them only for "concrete parameterized types", where each data type is parameterized by a single type. The primary benefit is to discover type mismatch errors at compile-time instead of run-time. There are other more general (and more complicated) uses of generics, including wildcards. This generality is useful for handling subtypes and inheritance. For more information, see this Generics FAQ and this generics tutorial.

    Q. Can concrete parameterized types be used in the same way as normal types?

    A. Yes, with a few exceptions (array creation, exception handling, with instanceof, and in a class literal).

    Q. Why do I get a "can't create an array of generics" error when I try to create an array of generics?

    public class ResizingArrayStack<Item> {
    Item[] a = new Item[1];
    }

    A. Unfortunately, creating arrays of generics is not possible in Java 1.5. The underlying cause is that arrays in Java are covariant, but generics are not. In other words, String[] is a subtype of Object[], but Stack<String> is not a subtype of Stack<Object>. To get around this defect, you need to perform an unchecked cast as in ResizingArrayStack.java.

    Q. So, why are arrays covariant?

    A. Many programmers (and programming language theorists) consider covariant arrays to be a serious defect in Java's type system: they incur unnecessary run-time performance overhead (for example, see ArrayStoreException) and can lead to subtle bugs. Covariant arrays were introduced in Java to circumvent the problem that Java didn't originally include generics in its design, e.g., to implement Arrays.sort(Comparable[]) and have it be callable with an input array of type String[].

    Q. Can I create and return a new array of a parameterized type, e.g., to implement a toArray() method for a generic queue?

    A. Not easily. You can do it using reflection provided that the client passes an object of the desired concrete type to toArray() This is the (awkward) approach taken by Java's Collection Framework.



    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2012-07-06 05:28 Chan Chen 閱讀(662) 評論(0)  編輯  收藏 所屬分類: Algorithm

    主站蜘蛛池模板: 免费无码婬片aaa直播表情| 亚洲色成人WWW永久在线观看| 国产精品亚洲专一区二区三区| 国产成人A在线观看视频免费| 亚洲电影在线播放| 91成人免费观看网站| 亚洲国产精品成人精品小说| 亚洲免费在线视频播放| 亚洲国产成人久久综合一区| 免费看国产成年无码AV片| 亚洲乱码av中文一区二区| 国产精品无码一区二区三区免费| 国产成人精品亚洲| 国产aⅴ无码专区亚洲av麻豆| 两个人看www免费视频| 亚洲午夜久久久精品影院| 久久久久久精品免费看SSS| 亚洲人成网站看在线播放| 免费看美女让人桶尿口| 国产成人高清亚洲一区久久| 国产成人A亚洲精V品无码| 91大神免费观看| 亚洲午夜久久久久久尤物| 午夜一级免费视频| 深夜a级毛片免费视频| 亚洲老妈激情一区二区三区| 精品熟女少妇av免费久久| 亚洲kkk4444在线观看| 亚洲人成网站色在线入口| 国产成人久久AV免费| 国产成人精品日本亚洲专| 亚洲成a人在线看天堂无码| 久久久久久成人毛片免费看| 亚洲一区欧洲一区| 在线亚洲精品自拍| 99久久这里只精品国产免费| 国产亚洲综合一区二区三区| 亚洲AV无码专区国产乱码电影 | 久久久久免费看黄a级试看| 国产亚洲精品成人AA片| 亚洲日韩小电影在线观看|