使用另一个堆栈查找堆栈中的最大值?

时间:2013-01-01 13:50:52

标签: c++ stack max

我有以下代码来查找堆栈中的最大值。它工作但我应该使用另一种方法来查找最大值,因为在调用getMax()函数后,我无法显示堆栈a。

int Sorter:: getMax(){
    c.push(a.top());
    a.pop();
    while(!a.empty()){
            if(a.top() > c.top()){
            c.pop();
                    c.push(a.top());
                    a.pop();
            }
            else
                    a.pop();
    }
    return c.top();
}

5 个答案:

答案 0 :(得分:3)

查找堆栈最大值的O(1)时间和内存方法如下:

  1. 对于堆叠中的每个元素,让我们将此元素的最大值存储在之下。
  2. 推送元素时,其存储的(最大)值将为max(st.top().value, st.top().maxValue)
  3. 弹出元素时,不需要更改任何内容。
  4. 因此,您可以在O(1)时间和内存复杂度中获取堆栈内所有元素的最大值。

    伪代码:

    class StackWithMax
    {
    struct node
    {
        int value; // an actual value;
        int maxValue; // maximum of below elements
    };
    
    stack<node> st;
    
    public:
    void pop()
    {
        st.pop();
    }
    
    void push(const int &val)
    {
       node newNode;
       newNode.value = val;
       newNode.maxValue = (st.empty() == true ? -INFINITY : max(st.top().maxValue, st.top().value) );
       st.push(newNode);
    }
    
    int maxStackValue() const
    {
        assert(st.empty() == false);
        return st.top().maxValue;
    }
    
    };
    

答案 1 :(得分:3)

将最大值保留在边变量中:

int max = a.top();
while(!a.empty()){
  c.push(a.top());
  a.pop()
  if(c.top() > max){
    max = c.top(); // find the maximum among the values of a.
  }
}

// This loop can be replaced with a.swap(c). As jogojapan mentioned.
// It is to demonstrate the principal.
while(!c.empty())
{
  a.push(c.top());  // return the values back into a
  c.pop();
}

return max;

答案 2 :(得分:0)

由于您已经有了工作代码,因此您需要分析这些内容。

  1. 现有解决方案的时间复杂度和空间复杂度是多少?
  2. 您可能已经知道,时间和空间之间需要权衡,您是否可以使用更多空间来实现更好的时间复杂度?

答案 3 :(得分:0)

我要做的是查看整个堆栈并保存答案,然后使用secodn堆栈重建原始文件。

int Sorter:: getMax(){
    if(a.empty)
    {
        //handle this however you see fit
    }

    int res = a.top;
    //search for the maximum
    while(!a.empty()){
        if(a.top() > res){
            res = a.top();
        }
        c.push(a.top());
        a.pop();
    }

    //restore the original stack
    while(!c.empty()){
        a.push(c.top());
        c.pop();
    }
    return res;
}

另外,“a”和“c”是不好的变量名。我让它们与你的代码保持一致。您可能应该使用更具描述性的内容。

答案 4 :(得分:0)

我认为如果允许使用临时变量,那么它就变得非常容易了 算法:

将堆栈A的顶部元素放入临时变量temp = StackA.top();
2.弹出堆栈A中的元素并检查它是否大于临时变量的值。
    2.1如果是,将值复制到temp并将其推送到堆栈B.     2.2否则只是将值推到堆栈B 3.重复步骤2,直到堆栈A为空

我知道这看起来像一个明显的(并没有什么特别的)解决方案。但它保留了堆栈的元素,如果你想要它们以相同的顺序,那么你可以再添加一个步骤来复制堆栈B中的所有pop元素并将其推回堆栈A.