数组LinkedList堆栈

时间:2015-11-06 00:52:02

标签: java arraylist stack

我必须使用索引0作为我的堆栈的TOP并且在实现此问题时遇到了问题。我得到所有null s,但输出100,200和300是我得到的唯一数字。我忽视的实现有什么问题吗? push方法应该实现在索引0处推送元素的ArrayListStack,并且应该只能删除顶部元素(索引0)

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));
        }
    }
}

3 个答案:

答案 0 :(得分:1)

问题在于

data[0] = newData;

你应该增加数据数组的索引,但是没有这样做,所以每个数组溢出流的最后一个值只是保留。

答案 1 :(得分: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();
}

答案 2 :(得分:0)

您的推送功能错误。它应该是这样的。当你推送一个新元素时,你需要将所有现有元素移动1个索引,否则你最终会重写索引UPDATE assinaturas SET isSubscribed = 0 WHERE id_usuario IN ( SELECT usr.id FROM usuarios AS usr WHERE usr.email = '$email' ) AND id_podcast IN ( SELECT pcst.id FROM podcasts AS pcst WHERE pcst.nome = '$nome' ) 并增加0。这是代码:

size