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

C++ 在O(1)时间C+中查找堆栈中的最小元素+;,c++,algorithm,stack,c++14,minimum,C++,Algorithm,Stack,C++14,Minimum,在这里,我使用mini()函数查找堆栈中的最小元素。在堆栈中按下并弹出时,我逻辑地设置了min1和min2。在哪些情况下,我的代码会失败?我的代码有什么问题 推送功能设置min1和min2变量min1对应于堆栈中最小的元素,min2对应于堆栈中第二个最小的元素。在pop中,如果popped元素等于mini,则我将min1更新为pop之前的第二个最小值并继续。所以在任何时候min1在堆栈中的值都是最小的 class stac { public: void push(int item) { if(t

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

推送功能设置
min1
min2
变量
min1
对应于堆栈中最小的元素,
min2
对应于堆栈中第二个最小的元素。在pop中,如果popped元素等于mini,则我将
min1
更新为pop之前的第二个最小值并继续。所以在任何时候
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;
}
类stac
{
公众:
无效推送(整数项)
{
如果(顶部>=堆栈大小-1)
{

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

保持两个堆栈,一个常规堆栈,另一个用于保持当前最小值。按下时,始终在此最小堆栈上按下当前最小值。因此,您将始终在当前堆栈顶部具有最小值。弹出时,从两个堆栈中弹出


或者在同一个堆栈上,您可以始终推送两个元素,新元素和新的最小值。并且在弹出时,弹出两个元素,一个当前元素,另一个当前最小值。

以下是您修改的代码:

#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;
}
#包括
#包括
使用名称空间std;
#定义堆栈大小10000
stac类
{
公众:
stac():顶部(-1)
{
}
无效推送(整数项)
{
如果(顶部>=堆栈大小-1)
{

cout如果可以在堆栈中添加额外的元数据作为数据的一部分,则可以在元数据中存储在此之前遇到的最小数据。无论弹出多少个元素,堆栈顶部的元数据都具有最小值。

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