首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阵列LinkedList栈

阵列LinkedList栈
EN

Stack Overflow用户
提问于 2015-11-06 00:52:02
回答 3查看 101关注 0票数 0

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

代码语言:javascript
复制
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));
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-06 02:17:49

由于其他人已经给了您一个完整的解决方案,下面是一个紧凑的版本,没有冗余代码(干的):

代码语言:javascript
复制
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++;
}

如果还添加此方法,则可以打印堆栈,而无需看到任何拖尾空值:

代码语言:javascript
复制
@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中更简单的版本:

代码语言:javascript
复制
@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
EN

Stack Overflow用户

发布于 2015-11-06 01:31:11

问题在于这句话

代码语言:javascript
复制
data[0] = newData;

您应该增加数据数组的索引,但它不是这样做的,因此每个数组在流上的最后值只剩下。

票数 1
EN

Stack Overflow用户

发布于 2015-11-06 01:53:30

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33557640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档