我必须使用索引0作为我的堆栈的顶部,并且在实现这一点时遇到了问题。我得到了所有的null,但是输出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));
}
}
}发布于 2015-11-06 02:17:49
由于其他人已经给了您一个完整的解决方案,下面是一个紧凑的版本,没有冗余代码(干的):
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();
}发布于 2015-11-06 01:31:11
问题在于这句话
data[0] = newData;您应该增加数据数组的索引,但它不是这样做的,因此每个数组在流上的最后值只剩下。
发布于 2015-11-06 01:53:30
你的推送功能错了。应该是这样的。当您推送一个新元素时,需要将所有现有元素转换为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++;
}https://stackoverflow.com/questions/33557640
复制相似问题