o(1)的堆栈实现

时间:2018-12-08 00:28:30

标签: java generics stack

我正在尝试实现一种具有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(); 
}
}

2 个答案:

答案 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中。