我必须使用索引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));
}
}
}
答案 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