<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

    主站蜘蛛池模板: 日本免费一区二区三区最新| 中文字幕影片免费在线观看 | 91嫩草免费国产永久入口| 亚洲午夜久久久久久久久电影网 | 色播在线永久免费视频网站| 亚洲无码视频在线| 一级做a爱过程免费视| 久久精品亚洲男人的天堂| 一级毛片一级毛片免费毛片| 亚洲片一区二区三区| 国产成人精品免费大全| 亚洲综合精品香蕉久久网| 四虎国产精品免费永久在线| 亚洲av福利无码无一区二区| 95老司机免费福利| 亚洲国产精品综合一区在线| 99久久免费精品国产72精品九九| 亚洲国产无线乱码在线观看| 一区国严二区亚洲三区| caoporm超免费公开视频| 久久久亚洲精品国产| 免费国产成人高清在线观看网站| 亚洲人成网站18禁止| 亚洲色偷拍区另类无码专区| 香蕉免费在线视频| 亚洲国产综合自在线另类| 在线看片无码永久免费aⅴ| 一区二区三区免费精品视频| 亚洲av无码成h人动漫无遮挡 | 91手机看片国产永久免费| 国产99精品一区二区三区免费 | 亚洲AⅤ优女AV综合久久久| 91国内免费在线视频| 亚洲毛片免费观看| 国产精品国产自线拍免费软件| 国产福利在线观看永久免费| 91亚洲国产在人线播放午夜| 国产成人综合久久精品免费| 全免费a级毛片免费看| 亚洲kkk4444在线观看| 国产精品亚洲片在线观看不卡 |