Mega Code Archive

 
Categories / Java / Generics
 

Generic Stack

/*  * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002.  * All rights reserved. Software written by Ian F. Darwin and others.  * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  *  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  *   * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee  * cup" logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,  * pioneering role in inventing and promulgating (and standardizing) the Java   * language and environment is gratefully acknowledged.  *   * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for  * inventing predecessor languages C and C++ is also gratefully acknowledged.  */ public class MyStackDemo {   public static void main(String[] args) {     MyStack<String> ms1 = new MyStack<String>();     ms1.push("billg");     ms1.push("scottm");     while (ms1.hasNext()) {       String name = ms1.pop();       System.out.println(name);     }     // Old way of using Collections: not type safe.     MyStack ms2 = new MyStack();     ms2.push("billg");               // EXPECT WARNING     ms2.push("scottm");              // EXPECT WARNING     ms2.push(new java.util.Date());  // EXPECT WARNING          // Show that it is broken      try {       String bad = (String)ms2.pop();       System.err.println("Didn't get expected exception!");     } catch (ClassCastException ex) {       System.out.println("Did get expected exception.");     }     // Removed the brokenness, print rest of it.     while (ms2.hasNext()) {       String name = (String)ms2.pop();       System.out.println(name);     }   } } /** A lax Stack implementation.  * @version $Id: MyStack.java,v 1.4 2004/03/07 23:18:59 ian Exp $  */ class MyStack<T> {   private int ix = 0;   public static final int MAX = 10;   private T[] data = (T[])new Object[MAX];   public void push(T obj) {     data[ix++] = obj;   }   public boolean hasNext() {     return ix > 0;   }   public boolean hasRoom() {     return ix < MAX;   }   public T pop() {     if (hasNext()) {       return data[--ix];     }     throw new ArrayIndexOutOfBoundsException(-1);   } }