2015-11-06 69 views
0

我必须使用索引0作为我的堆栈的TOP,并且在执行此操作时遇到问题。我得到所有null s,但输出100,200和300是我所得到的唯一数字。我忽略的实现有什么问题吗?推送方法应该实现ArrayListStack,在索引0推压元件,以及应该能够仅除去所述顶部元件(索引0)Array LinkedList Stacks

public class NaughtyArrayStack<E> implements Stack<E> 
{ 
    private E[] data = (E[])(new Object[10]); 
    private int size; 
    public boolean isEmpty() 
    { 
     return (size == 0); 
    } 

    public void push(E newData) 
    { 
     if (size == data.length) 
     { 
      E[] newDataArray = (E[])(new Object[size*2]); 
      for (int i = 0; i < size; i++) 
       if(isEmpty()) 
        data[0] = newData; 
       else 
        newDataArray[i+1] = data[i]; 
      data = newDataArray; 
     } 

     data[0] = newData; 
     size++; 
    } 

    public static void main(String[] args) 
    { 
     Stack<Pancake> breakfast = new NaughtyArrayStack<Pancake>(); 
     for (int i = 10; i <= 300; i += 10) 
     { 
      breakfast.push(new Pancake(i)); 
     } 
    } 
} 
+1

请解释你的'push'方法。 –

+0

什么是数据?分享您的完整代码 –

+0

这个要求就像我见过的最差执行堆栈。所有堆栈添加/删除操作都是O(n)。 – Andreas

回答

1

既然别人已经给你一个完整的解决方案,这里是一个精简版,没有多余的代码(DRY):

public void push(E newValue) 
{ 
    E[] newData = (this.size < this.data.length ? this.data : (E[])new Object[this.size * 2]); 
    System.arraycopy(this.data, 0, newData, 1, this.size); 
    newData[0] = newValue; 
    this.data = newData; 
    this.size++; 
} 

如果您还添加了这种方法,你可以打印堆栈没有看到任何尾随的空值:

@Override 
public String toString() { 
    StringBuilder buf = new StringBuilder().append('['); 
    for (int i = 0; i < this.size; i++) { 
     if (i != 0) buf.append(", "); 
     buf.append(this.data[i]); 
    } 
    return buf.append(']').toString(); 
} 

或者用Java 8中的简单版本:

@Override 
public String toString() { 
    StringJoiner joiner = new StringJoiner(", ", "[", "]"); 
    for (int i = 0; i < this.size; i++) 
     joiner.add(String.valueOf(this.data[i])); 
    return joiner.toString(); 
} 
1

的问题是与线

data[0] = newData; 

您应该增加数据数组的索引,但不会这样做,因此每个数组溢出的最后一个值只剩下了。

+0

感谢让它工作的人,你会知道为什么两个null owuld会跟着 – Consultion

0

您的推送功能是错误的。它应该是这样的。当您推新元素时,您需要将所有现有元素移动1个索引,否则您将最终重写索引0并增加size。这里是代码:

public void push(E newData) { 
    if (size == data.length) { 
     E[] newDataArray = (E[]) (new Object[size * 2]); 
     for (int i = 0; i < size; i++) { 
      newDataArray[i + 1] = data[i]; 
     } 
     newDataArray[0] = newData; // set the top to the new element 
     data = newDataArray; // set data to reference the bigger array 
    } else { 
     // shift all the elements int he array by one so that you can add the new element to the 
     // index 0 
     int i = size - 1; 
     while (i >= 0) { 
      data[i + 1] = data[i]; 
      i--; 
     } 
     data[0] = newData; 
    } 

    size++; 
} 
+0

为什么使用'while'循环?一个'for'循环会更好,并且它可能会让你实际减少'i',这是防止**无限循环**所需的。 – Andreas

+0

对不起修复了无限循环问题。您可以使用for或while循环。没关系。 OP错过了将元素移位1的步骤。 – pgiitu