All Downloads are FREE. Search and download functionalities are using the official Maven repository.

shz.core.stack.a.ArrayStack Maven / Gradle / Ivy

package shz.core.stack.a;

import java.io.Serializable;
import java.util.EmptyStackException;

/**
 * 基于动态数组的栈
 */
public abstract class ArrayStack implements Serializable {
    private static final long serialVersionUID = -8049435863541900492L;
    protected static final int DEFAULT_CAPACITY = 8;
    protected int capacity, size;

    ArrayStack(int capacity) {
        if (capacity < 1) throw new IllegalArgumentException();
        this.capacity = capacity;
    }

    public final int size() {
        return size;
    }

    public final boolean isEmpty() {
        return size == 0;
    }

    public final void clear() {
        size = 0;
    }

    protected final void checkEmpty() {
        if (size == 0) throw new EmptyStackException();
    }

    protected final void beforePush() {
        if (size == capacity) {
            if (size == Integer.MAX_VALUE) throw new OutOfMemoryError();
            int newCap = capacity >= 64 ? capacity + (capacity >> 1) : capacity << 1;
            resize(newCap < 0 ? Integer.MAX_VALUE : newCap);
        }
    }

    protected abstract void resize(int capacity);

    protected final void afterPop() {
        setNull(size);
        reduce();
    }

    private void reduce() {
        if (capacity > 64) {
            int newCap = size + 1 + (size + 1 >> 1);
            if (newCap + (newCap >> 1) <= capacity) resize(newCap);
        } else if (size + 1 <= capacity >>> 2) resize(capacity >> 1);
    }

    protected abstract void setNull(int i);
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy