在O(1)时间C 中找到堆栈中的最小元素
FInd minimum element in stack in O(1) time C++
在这里,我使用mini()
函数在堆栈中找到最小元素。在堆栈中推出并弹出时,我逻辑地设置了min1
和min2
。在哪些情况下,我的代码会失败?我的代码有什么问题?
推动功能集min1
和min2
变量。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;
}
如果您可以在堆栈中有其他元数据作为数据的一部分,则可以存储直到元数据中遇到的最小数据。无论您弹出多少个元素,堆栈顶部的元数据都具有最小的价值。
相关文章:
- 将在堆栈上声明的元素添加到静态数组
- 静态堆栈函数不会 1) 输入第一个元素 2)添加新元素时识别旧元素
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 无法获取已填充堆栈<char>的顶部元素
- 使用 STL 交换堆栈 C++ 中的第一个和最后一个元素
- 如何在 C++ 中将从文本文件中读取的元素推送和弹出到数组中,并按 Revserse 顺序输出堆栈?
- 使用堆栈查找每个元素的下一个更大的元素
- 如何在函数中接收堆栈元素
- 在O(1)时间C 中找到堆栈中的最小元素
- 将元素从队列复制到堆栈
- 根据堆栈操作 c++ 计算元素的最大数量
- 哪些更好的方法可以显示使用C STL创建的堆栈而不弹出每个元素的方法
- 为什么 size() 在与其他堆栈交换元素后提供错误的堆栈大小?
- 将顶部堆栈元素传输到第二个堆栈的第一个
- 在堆栈中移动元素
- 从分配在堆栈上的对象指针的向量中删除元素
- 在C++中显示堆栈元素时的无限循环
- 唯一元素堆栈的容器
- 如果我将堆栈上分配的元素的指针推入 std::vector,则其成员的值会发生变化
- 是否可以在模板类内部使用类堆栈元素的向量