【问题标题】:FInd minimum element in stack in O(1) time C++在 O(1) 时间内找到堆栈中的最小元素 C++
【发布时间】:2018-10-07 20:54:07
【问题描述】:

在这里,我使用mini() 函数查找堆栈中的最小元素。在堆栈中推入和弹出时,我在逻辑上设置了min1min2。在哪些情况下我的代码会失败?我的代码有什么问题?

push 函数设置min1min2 变量。 min1 对应于最小元素,min2 对应于堆栈中的第二个最小元素。在弹出窗口中,如果弹出的元素等于 mini,那么我在弹出窗口之前将 min1 更新为第二个最小值并继续。所以在任何时候min1 在堆栈中的价值都是最低的。

class stac
{
public:
void push(int item)
{
if(top>=STACK_SIZE-1)
{
    cout<<"Full"<<endl;
    return;
}
else
{
    if(item<min1)
    {
        min2 = min1;
        min1=item;
    }
    s[++top]=item;
    return;
}
}

void pop()
{
if(top==-1)
{
    cout<<"Empty"<<endl;
    return;
}
else
{
    if(s[top]==min1)
    {
        min1=min2;
    }
    top--;
    return;
}
}
void mini()
 {
   if(top==-1)
  {
      cout<<"no minimum"<<endl;
      return;
}
else
{
    cout<<min1<<endl;
}
}


private:
int min1 = INT_MAX;
int min2;
int s[STACK_SIZE];
int top = -1;
};
int main()
{

  stac s1;

  s1.push(5);
  s1.push(2);
  s1.push(9);
  s1.push(1);
  s1.push(24);
  s1.push(-1);
  s1.push(-87);
  s1.push(23);
  s1.mini();
  s1.display();

  return 0;
}

【问题讨论】:

  • 假设我推送三个元素,每个元素都比前一个小(比如 3、2 和 1);然后弹出其中两个。此时堆栈中最小元素的值是多少,min1 的值是多少?
  • main 中,您可能应该在调用s1.mini 之前调用s1.pop 几次

标签: c++ algorithm stack c++14 minimum


【解决方案1】:

问题是您只保存最后两个最小值。弹出两个最小值后,你现在不知道哪个是最小值了。

保留两个堆栈,一个常规堆栈,另一个用于保持当前最小值。在推送时,总是在这个最小堆栈上推送当前最小值。因此,您将始终在当前堆栈顶部拥有最小值。弹出时,从两个堆栈中弹出。

或者在同一个堆栈上,你总是可以推送两个元素,一个新元素和一个新的最小值。在弹出时,弹出两个元素,一个当前元素,另一个当前最小值。

【讨论】:

    【解决方案2】:

    这是您修改后的代码:

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    #define STACK_SIZE 10000
    
    class stac
    {
    public:
    
    stac() : top(-1)
    {
    
    }
    
    void push(int item)
    {
    if(top>=STACK_SIZE-1)
    {
        cout<<"Full"<<endl;
        return;
    }
    else
    {
        cout << "top is" << top << endl;
        int currentmin = min[top];
        top ++;
        if(top == 0 || item < currentmin )
        {
            min[top] = item; // New minimum
        }
        else
        {
           min[top] = currentmin; //keep current minimum
        }
    
        s[top]=item;
    
        return;
    }
    }
    
    void pop()
    {
    if(top==-1)
    {
        cout<<"Empty"<<endl;
        return;
    }
    else
    {
        top--;
        return;
    }
    }
    void mini()
     {
       if(top==-1)
      {
          cout<<"no minimum"<<endl;
          return;
    }
    else
    {
        cout<<min[top]<<endl;
    }
    }
    
    void display()
    {
      int i = top;
      cout << "elememt stack:";
    
      while(i)
      {
         cout << s[i--] << " " ;
    
      }
    
      i = top;
      cout << "\nmin stack:";
    
      while(i)
      {
         cout << min[i--] << " " ;
      }
      cout << "\n";
    }
    
    private:
    
    int s[STACK_SIZE];
    int min[STACK_SIZE];
    int top = -1;
    };
    int main()
    {
    
      stac s1;
    
      s1.push(5);
      s1.push(2);
      s1.push(9);
      s1.push(1);
      s1.push(24);
      s1.push(-1);
      s1.push(-87);
      s1.push(23);
      s1.mini();
      s1.display();
    
      return 0;
    }
    

    【讨论】:

      【解决方案3】:

      如果您可以将其他元数据作为堆栈中数据的一部分,您可以将在该点之前遇到的最少数据存储在元数据中。不管你弹出多少元素,栈顶的元数据都会有最小值。

      【讨论】:

        猜你喜欢
        • 2016-08-12
        • 2012-10-24
        • 2013-12-08
        • 2016-11-12
        • 1970-01-01
        • 2020-06-08
        • 2021-06-21
        • 1970-01-01
        • 2016-10-04
        相关资源
        最近更新 更多