001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package java.util;
019:
020: /**
021: * <code>Stack</code> is a Last-In/First-Out(LIFO) data structure which
022: * represents a stack of objects. It enables users to pop and push onto the
023: * stack, including null objects. There is no limit to the size of the stack
024: */
025: public class Stack<E> extends Vector<E> {
026:
027: private static final long serialVersionUID = 1224463164541339165L;
028:
029: /**
030: * Constructs a stack with the default size of <code>Vector</code>.
031: */
032: public Stack() {
033: super ();
034: }
035:
036: /**
037: * Determines if the stack is empty or not.
038: *
039: * @return true if the stack is empty, false otherwise
040: */
041: public boolean empty() {
042: return elementCount == 0;
043: }
044:
045: /**
046: * Returns the element at the top of the stack without removing it.
047: *
048: * @return the element at the top of the Stack
049: * @exception EmptyStackException
050: * when empty() is true
051: * @see #pop
052: */
053: @SuppressWarnings("unchecked")
054: public synchronized E peek() {
055: try {
056: return (E) elementData[elementCount - 1];
057: } catch (IndexOutOfBoundsException e) {
058: throw new EmptyStackException();
059: }
060: }
061:
062: /**
063: * Returns the element at the top of the stack and removes it.
064: *
065: * @return the element at the top of the stack.
066: * @exception EmptyStackException
067: * when empty() is true
068: * @see #peek
069: * @see #push
070: */
071: @SuppressWarnings("unchecked")
072: public synchronized E pop() {
073: if (elementCount == 0) {
074: throw new EmptyStackException();
075: }
076: final int index = --elementCount;
077: final E obj = (E) elementData[index];
078: elementData[index] = null;
079: modCount++;
080: return obj;
081: }
082:
083: /**
084: * Pushes the object from the parameter onto the top of the stack.
085: *
086: * @param object
087: * The object to be added to the stack
088: *
089: * @return the object argument
090: *
091: * @see #peek
092: * @see #pop
093: */
094: public E push(E object) {
095: addElement(object);
096: return object;
097: }
098:
099: /**
100: * Returns the index of the first occurrence of the object.
101: *
102: * @return the index of the first occurrence of the object
103: * @param object
104: * the object to be searched
105: */
106: public synchronized int search(Object object) {
107: final Object[] dumpArray = elementData;
108: final int size = elementCount;
109: if (object != null) {
110: for (int i = size - 1; i >= 0; i--) {
111: if (object.equals(dumpArray[i])) {
112: return size - i;
113: }
114: }
115: } else {
116: for (int i = size - 1; i >= 0; i--) {
117: if (dumpArray[i] == null) {
118: return size - i;
119: }
120: }
121: }
122: return -1;
123: }
124: }
|