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    }