/* Copyright (C) 1998, 1999 Cygnus Solutions This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package java.util; /** * @author Warren Levy * @date August 20, 1998. */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct */ public class Stack extends Vector { // Could use Vector methods internally for the following methods // but have used Vector fields directly for efficiency (i.e. this // often reduces out duplicate bounds checking). public boolean empty() { return elementCount == 0; } public synchronized Object peek() { if (elementCount == 0) throw new EmptyStackException(); return elementData[elementCount - 1]; } public synchronized Object pop() { if (elementCount == 0) throw new EmptyStackException(); Object obj = elementData[--elementCount]; // Set topmost element to null to assist the gc in cleanup elementData[elementCount] = null; return obj; } public Object push(Object obj) { // When growing the Stack, use the Vector routines in case more // memory is needed. // Note: spec indicates that this method *always* returns obj passed in! addElement(obj); return obj; } public synchronized int search(Object obj) { // Return the position of obj on the stack as measured from the top; // i.e. the top element is 1, the next element down is 2, etc. // If obj is not on the stack, return -1 for (int i = elementCount-1; i >=0; --i) if (elementData[i].equals(obj)) return elementCount - i; return -1; } }