我想创建一个固定大小的堆栈,并在堆栈满时截断堆栈。对于这一点,已经存在一种创建固定大小堆栈的方法,但我不想实现一个类。
这样做是可能的吗?
Stack<String> stack = new Stack<String>(){
private static final long serialVersionUID = 1L;
public String push(String item) {
if (this.size() == FIXED_SIZE) {
//truncate()
}
return super.push(item);
}
};
其余的堆栈方法保持不变吗?
这就是我在文档中发现的。我没有使用或测试它。所以我不确定这将如何解决。因为removeElementAt()
继承自Vector类,我希望removeElementAt(0)
仍然会删除底部的元素。
Stack<String> stack = new Stack<String>(){
private static final long serialVersionUID = 1L;
public String push(String item) {
if (this.size() == FIXED_SIZE) {
this.removeElementAt(0);
}
return super.push(item);
}
};
我也假设,你所说的截断是为了删除当前列表中的第一个元素,如果你只是想拒绝新的元素,你可以返回null
。
这样如何:
Public class TruncatedStack<T> extends FixedStack<T>
{
private static final long serialVersionUID = 1L;
@Override
public String push(String item) {
if (this.top == size) {
this.top = -1;
return super.push(item);
}
}
这是我随口写的(未经测试)。正如在评论中提到的,固定大小的堆栈只是一个带有计数器的数组,用于跟踪顶部。
public class FixedSizeStack {
int top, numElements;
int[] baseArray;
public FixedSizeStack(int maxSize) {
top = 0;
numElements = 0;
baseArray = new int[maxSize];
}
public void push(int num) {
baseArray[top] = num;
top = (top+1) % baseArray.length;
numElements++;
}
public int pop(int num) {
if(numElements == 0) return null; //or throw exception--you've removed too many elements!
numElements--;
top = (top == 0) ? (baseArray.length - 1) : (top - 1);
return baseArray[top];
}
}
是的,你几乎完全正确。你只需要做一个this.remove(0)
,然后你就完成了。
Stack<String> stack = new Stack<String>(){
@Override
public String push(String item) {
if (this.size() == FIXED_SIZE) {
this.remove(0)
}
return super.push(item);
}
};