Java pop()实现-基于数组的堆栈
目前正在努力完成一项家庭作业,要求我们实现基于数组的堆栈实现。我正在努力使用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
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));
}
}