Java pop()实现-基于数组的堆栈

Java pop()实现-基于数组的堆栈,java,arrays,stack,Java,Arrays,Stack,目前正在努力完成一项家庭作业,要求我们实现基于数组的堆栈实现。我正在努力使用pop()方法。有关我当前的实施,请参见以下内容: public Object pop() throws EmptyStackException { if (isEmpty()) throw new EmptyStackException(); this.size--; Object result = this.elements[size]; this.elements[si

目前正在努力完成一项家庭作业,要求我们实现基于数组的堆栈实现。我正在努力使用pop()方法。有关我当前的实施,请参见以下内容:

public Object pop() throws EmptyStackException {
    if (isEmpty())
      throw new EmptyStackException();

    this.size--;
    Object result = this.elements[size];
    this.elements[size] = null;

    if (size < (capacity / 4)) {
      capacity = capacity / 2;
      Object temp[] = elements;
      elements = new Object[capacity];

      for (int i = 0; i < temp.length; i++)
        elements[i] = temp[i];
    }
    return result;
}
public Object pop()引发EmptyStackException{
if(isEmpty())
抛出新的EmptyStackException();
这个尺寸--;
对象结果=this.elements[大小];
this.elements[size]=null;
如果(尺寸<(容量/4)){
容量=容量/2;
对象温度[]=元素;
元素=新对象[容量];
对于(int i=0;i
我遇到的问题是,在当前的迭代中,pop方法不会从数组中删除项,也不会在指定级别(即大小小于容量的25%)减少列表容量。

快速脏(对于学生来说“简单”):

公共类MyStack
{
对象[]元素;
整数大小;
国际能力;
公共MyStack()
{
该容量=1;
this.elements=新对象[容量];
此值为0.size=0;
}
公共布尔值为空()
{
返回(大小==0);
}
公共无效推送(对象obj)
{
如果(大小=容量){
容量=容量*2;
调整大小();
}
元素[大小]=obj;
大小++;
}
公共对象pop()引发异常
{
if(isEmpty()){
抛出新异常();
}
这个尺寸--;
对象结果=this.elements[大小];
this.elements[size]=null;
如果(尺寸<(容量/4)){
容量=容量/2;
调整大小();
}
返回结果;
}
私有void resize()
{
对象温度[]=元素;
元素=新对象[容量];
对于(int i=0;i
您不需要在弹出窗口上调整大小,因为您可以将其保持原来的大小。在我看来,它删除了数组中的一个元素。尝试在不首先调整大小的情况下使其工作。不删除项目是什么意思?如果在方法之后查找.elements[size],您将发现一个obj且不为null?在for循环中,上限应为elements.length,否则将触发ArrayIndexOutOfBoundsException。否则我看没问题。我同意Peter的观点,在优化容量之前,您应该首先解决第一个问题。上限应该是大小,而不是长度。为什么要复制所有的空值?我同意@Peter Lawrey的观点,向下调整大小通常是不必要的。
public class MyStack
{

    Object[] elements;
    int size;
    int capacity;

    public MyStack()
    {
        this.capacity = 1;
        this.elements = new Object[capacity];
        this.size = 0;

    }

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

    public void push(Object obj)
    {
        if (size == capacity) {
            capacity = capacity * 2;
            resize();
        }
        elements[size] = obj;
        size++;
    }

    public Object pop() throws Exception
    {
        if (isEmpty()) {
            throw new Exception();
        }

        this.size--;
        Object result = this.elements[size];
        this.elements[size] = null;

        if (size < (capacity / 4)) {
            capacity = capacity / 2;
            resize();
        }
        return result;
    }

    private void resize()
    {
        Object temp[] = elements;
        elements = new Object[capacity];

        for (int i = 0; i < size; i++) {
            elements[i] = temp[i];
        }
    }

    public static void main(String[] args) throws Exception
    {
        MyStack my = new MyStack();
        my.push(1);
        my.push(2);
        my.push(3);
        my.push(4);
        my.push(5);

        Object o5 = my.pop();
        Object o4 = my.pop();
        Object o3 = my.pop();
        Object o2 = my.pop();
        Object o1 = my.pop();
        Object o0 = null;
        try {
            o0 = my.pop();
        } catch (Exception e) {
            System.out.println("Empty stack");
        }
        System.out.println(String.format("%s %s %s %s %s %s", o5, o4, o3, o2, o1, o0));

    }
}