1、题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
2、知识点:栈
3、思路:添加一个辅助栈,只记录比栈顶元素小的元素的下标(注意:是记录下标而不是元素值,因为元素值可能重复!),当主栈弹出了当前最小元素时,辅助栈一并弹出,这样辅助栈的栈顶始终保存了最小元素的下标。
/*用途:
**说明:mstack.h头文件
**算法:
*/
#ifndef MSTACK_H
#define MSTACK_H
#include <cstdio>
#include <limits.h>
using namespace std;
#define MAXN 100
class MStack{
private:
int n;
int data[MAXN];
int m; //记录assist中元素数目
int assist[MAXN];
public:
MStack();
void push(int val);
int pop();
bool empty();
int min();
};
#endif
MStack::MStack()
{
n = m = 0;
}
void MStack::push(int val)
{
if(n <= MAXN)
data[n] = val;
else{
fprintf(stderr, "栈已满!\n");
return;
}
if(n == 0 || val < data[assist[m-1]]) //如果是第一个元素或者更小元素
assist[m++] = n;
n++;
}
int MStack::pop()
{
if(!empty()){
n--;
if(n == assist[m-1]) //如果是最小元素出栈,则辅助栈也要同步弹出
m--;
return data[n];
}
fprintf(stderr, "栈已空!\n");
return -1;
}
bool MStack::empty()
{
return n == 0;
}
int MStack::min()
{
if(!empty())
return data[assist[m-1]];
else{
fprintf(stderr, "栈已空,无最小元素!\n");
return -1;
}
}

本文介绍了一种特殊栈的设计方案,该栈除了具备基本的push和pop操作外,还提供了一个min函数,用于返回栈内最小元素。通过维护一个辅助栈记录最小元素下标,确保min、push和pop操作均保持O(1)的时间复杂度。
2202

被折叠的 条评论
为什么被折叠?



