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
几次