这里我使用mini()
函数找到堆栈中的最小元素。在推送和弹出堆栈时,我在逻辑上设置了min1
和min2
。在哪些情况下我的代码会失败?我的代码有什么问题?
推送功能设置min1
和min2
个变量。 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;
}
答案 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)
如果您可以将其他元数据作为堆栈中数据的一部分,则可以存储在元数据中该点之前遇到的最小数据。无论您弹出多少元素,堆栈顶部的元数据都将具有最小值。