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