在O(1)时间C ++中的堆栈中的最小元素

时间:2018-04-27 04:15:37

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

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

推送功能设置min1min2个变量。 min1对应于最小元素,min2对应于堆栈中的第二个最小元素。在pop中如果popped元素等于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 个答案:

答案 0 :(得分:0)

问题是你只保留最后两个最小值。弹出两个miminum号后,你现在不知道哪个是最小值。

保留两个堆叠,一个是常规堆叠,另一个是保持最小电流。推动总是在最小堆栈上推动电流最小值。因此,您将始终在当前堆栈之上具有最小值。弹出时,从两个堆栈中弹出。

或者在相同的堆栈上,您可以随时推送两个元素,new元素以及新的minumum。弹出时,弹出两个元素,一个当前元素,另一个当前元素。

答案 1 :(得分:0)

以下是您修改后的代码:

#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;
}

答案 2 :(得分:0)

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