我正在尝试实现一种具有push(),pop(),getMaxSoFar()的Stack。 应该在o(1)时间执行。但是,我在push(T值)中出错,我也不知道为什么。错误消息说运算符“> =”没有在T的类型中定义。我只是想检查代码,所以我将int类型代替了,但它没有用。
class FastMaxStack<T>
{
private Stack<T> stack;
private Stack<T> maxStack;
public FastMaxStack()
{
stack = new Stack();
maxStack = new Stack();
}
public void push(T value)
{
if(maxStack.isEmpty())
{
maxStack.push(value);
}
else if(value >= maxStack.peek())
{
maxStack.push(value);
}
stack.push(value);
}
public T pop()
{
maxStack.pop();
return stack.pop();
}
public T getMaxSoFar()
{
return maxStack.peek();
}
}
答案 0 :(得分:0)
您的push
方法假定每种可能的类型>=
支持T
运算符。但是,仅数字类型支持该运算符。
也许您应该将您的类定义为仅对整数而非任何数据类型进行操作。
另一方面,也许您可以为所有Comparables
实现您的类。
class FastMaxStack<Comparable<T>>
{
//etc...
}
答案 1 :(得分:0)
(评论太久了)
还有另一个问题。
push
总是按stack
,但只有值至少等于顶部时才按maxStack
。到目前为止,一切都很好。
但是pop
总是从两者中弹出。两个问题:
EmptyStackException
没有足够的元素,也会出现maxStack
(如果您不按递增的顺序推送值,则会发生这种情况)。 getMaxSoFar
的值也不正确。据我了解,您正在尝试做什么,maxStack
应该在当前状态下将堆栈的max元素置于顶部。但是,假设您推送的值小于top,maxStack
不会更新,并且如果您弹出(从这两个位置弹出),则maxStack
中的最大值会丢失。但它仍在stack
中。