001 /*
002 * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
003 *
004 * Redistribution and use in source and binary forms, with or without
005 * modification, are permitted provided that the following conditions are met:
006 *
007 * o Redistributions of source code must retain the above copyright notice,
008 * this list of conditions and the following disclaimer.
009 *
010 * o Redistributions in binary form must reproduce the above copyright notice,
011 * this list of conditions and the following disclaimer in the documentation
012 * and/or other materials provided with the distribution.
013 *
014 * o Neither the name of imagero Andrey Kuznetsov nor the names of
015 * its contributors may be used to endorse or promote products derived
016 * from this software without specific prior written permission.
017 *
018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030 package com.imagero.util;
031
032 import java.util.EmptyStackException;
033
034 /**
035 * Stack implementation not based on Vector
036 */
037 public class Stack {
038
039 Object[] elements;
040
041 int count;
042
043
044 public Stack() {
045 this(10);
046 }
047
048 public Stack(int count) {
049 this.elements = new Object[count];
050 }
051
052 public Object push(Object item) {
053 checkSize(count + 1);
054 elements[count++] = item;
055 return item;
056 }
057
058 public Object pop() {
059 if (count > 0) {
060 count--;
061 Object obj = elements[count];
062 elements[count] = null;
063 return obj;
064 }
065 throw new EmptyStackException();
066 }
067
068 public Object peek() {
069 if(count == 0) {
070 throw new EmptyStackException();
071 }
072 return elements[count - 1];
073 }
074
075 public Object peek(int index) {
076 if(index < count) {
077 return elements[index];
078 }
079 else {
080 throw new IndexOutOfBoundsException();
081 }
082 }
083
084 public int getCount() {
085 return count;
086 }
087
088 public boolean isEmpty() {
089 return count == 0;
090 }
091
092 private void checkSize(int minSize) {
093 if (minSize > elements.length) {
094 Object oldData[] = elements;
095 elements = new Object[Math.max(minSize + 10, elements.length * 2)];
096 System.arraycopy(oldData, 0, elements, 0, count);
097 }
098 }
099 }