Java 数组链接列表堆栈

Java 数组链接列表堆栈,java,arraylist,stack,Java,Arraylist,Stack,我必须使用索引0作为堆栈的顶部,并且在实现这一点时遇到问题。我得到了所有的nulls,但输出100、200和300是我得到的唯一数字。我忽略的实现是否有问题?push方法应该实现ArrayListStack,它在索引0处推送元素,并且应该只能删除顶部元素(索引0) 公共类NoutyAryStack实现堆栈 { 私有E[]数据=(E[])(新对象[10]); 私有整数大小; 公共布尔值为空() { 返回(大小==0); } 公共无效推送(E新数据) { if(size==data.length)

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

公共类NoutyAryStack实现堆栈
{
私有E[]数据=(E[])(新对象[10]);
私有整数大小;
公共布尔值为空()
{
返回(大小==0);
}
公共无效推送(E新数据)
{
if(size==data.length)
{
E[]新数据数组=(E[])(新对象[size*2]);
对于(int i=0;i对于(inti=10;i而言,问题在于线路

data[0] = newData;

你应该增加数据数组的索引,但没有这样做,因此每个数组的最后一个值只剩下一个。

你的推送功能是错误的。应该是这样的。当你推送一个新元素时,你需要将所有现有元素移1个索引,否则你只会重写索引
0
和增量
大小
。以下是代码:

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++;
}
public void push(E newData){
if(size==data.length){
E[]新数据数组=(E[])(新对象[size*2]);
对于(int i=0;i=0){
数据[i+1]=数据[i];
我--;
}
数据[0]=新数据;
}
大小++;
}

由于其他人已经为您提供了完整的解决方案,这里是一个紧凑的版本,没有多余的代码():

public void push(E newValue)
{
E[]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();
}
@覆盖
公共字符串toString(){
StringBuilder buf=new StringBuilder().append(“[”);
for(int i=0;i
或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();
}
@覆盖
公共字符串toString(){
细木工=新细木工(“,”,“[”,“]);
for(int i=0;i
请解释您的
push
方法的作用。什么是
数据
?共享您的完整代码该要求就像我见过的堆栈执行最差的实现。所有堆栈添加/删除操作都是O(n).是的,我知道,但我们被迫做这样毫无意义的事情,然后我们开始运行它们以查看时间上的差异,如果是巨大的hahaSo,让我试着理解编写的代码:当
数据
数组已满时,分配新数组(好),将现有数据复制到移位1的新数组(坏!),使用奇怪的
如果
语句永远不可能为真(
isEmpty()
为假,因为大小>=10,太糟糕了!),用新数组替换旧数组(好),然后用新值替换第一个元素(坏!),并更新大小(好)。当
数据
未满时,用新值替换第一个元素(坏!),并更新大小(好)。感谢让它工作的人,你知道为什么后面会有两个空值吗?为什么使用
while
循环?如果使用
for
循环会更好,而且它可能会使你实际减少
i
,这是防止无限循环所需的。是的,抱歉修复了无限循环问题。你可以使用for或while循环。它没关系。OP错过了将元素移动1的步骤。
@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();
}