定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
#include<iostream>
#include<iomanip>
using namespace std;
/*
2.设计包含min函数的栈(栈)
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
*/
#define maxNum
template<typename T,int N>
class stack
{
public:
stack<T,N>()
{
top=-1;
min_index=-1;
}
bool push(T val)
{
if(top>=N-1)
return false;
m_stack[++top]=val;
if(val<this->min())
{
min_mem[top]=min_index;
min_index=top;
}
else
{
min_mem[top]=-1;
}
return true;
}
int min()
{
if(top==-1)
return maxNum;
else
{
return m_stack[min_index];
}
}
int pop()
{
if(top==-1)
return maxNum;
else
{
int ret;
ret=m_stack[top];
if(top==min_index)
{
min_index=min_mem[top];
}
top--;
return ret;
}
}
private:
T m_stack[N];
int min_mem[N];
int top;
int min_index;
};
int main()
{
system("pause");
return 0;
}
分析:以上代码在DevC++中正常编译。DevC++适合写小型C++,程序小巧,安装也很快,完美支持最新C++标准。
代码中,定义了一个stack类,采用模板。N为堆栈大小,这里把它作为模板参数,其实更好的方法是作为一个const成员变量。类型T的对象需要支持比较操作,因此如果不是内建类型,需要重载比较操作符。
maxNum 为无穷大,压入堆栈中的数字不能大于maxNmu。这个算法是一个用空间换时间的思想,需要通常堆栈的2倍空间。
实现的思路都在代码里了,请指教!