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

FInd minimum element in stack in O(1) time C++

本文关键字:堆栈 元素 时间      更新时间:2023-10-16

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

推动功能集min1min2变量。min1对应于最小元素,min2对应于堆栈中的第二个最小元素。在POP中,如果弹出元素等于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;
}

问题是您只节省了最后两个最小值。在弹出两个Miminum编号后,您不知道哪个是最小的。

保留两个堆栈,一个定期,另一个用于保持最小值。在推动此最低堆栈上的推动始终将电流最小值。因此,您将始终在当前堆栈上具有很小的价值。弹出时,来自两个堆栈。

或在同一堆栈上,您始终可以按两个元素,新元素以及新元素。在弹出时,弹出两个元素,一个当前元素,另一个当前元素。

这是您的修改代码:

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

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