声明:此题目来自 v_JULY_v的blog,出处http://blog.csdn.net/v_july_v/article/details/6004660
参考文章:http://blog.csdn.net/lihappy999/article/details/7296173
代码经过本人调试,不敢保证是最优的,但应该是正确的,如果错误,希望指正,改进也可以。谢谢!!!
问题:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
答案:
//20121121
#include <iostream>
#include <stack>
using namespace std;
template<class T>
class mystacks{
public:
void pushs(T n);
void pops(void);
T mins(void);
private:
struct sn//StackNode
{
T values;
T minValue;
};
stack<sn> nQueue;
sn tempSN;
};
int main()
{
mystacks<int> st;
st.pushs(12);
st.pushs(34);
st.pushs(11);
st.pushs(45);
st.pops();
cout<<"mins="<<st.mins()<<endl;
st.pops();
cout<<"mins="<<st.mins()<<endl;
st.pops();
cout<<"mins="<<st.mins()<<endl;
st.pops();
cout<<"mins="<<st.mins()<<endl;
st.pops();
cout<<"mins="<<st.mins()<<endl;
return 0;
}
template<class T>
void mystacks<T>::pushs(T n)
{
if (nQueue.size()==0)
{
tempSN.values=n;
tempSN.minValue=n;
nQueue.push(tempSN);
}
else
{
tempSN.values=n;
if (nQueue.top().minValue>n)
{
tempSN.minValue=n;
}
else
{
tempSN.minValue=nQueue.top().minValue;
}
nQueue.push(tempSN);
}
cout<<"pushs:"<<n<<endl;
}
template<class T>
void mystacks<T>::pops()
{
if (nQueue.size()==0)
{
cout<<"stack empty"<<endl;
}
else
{
nQueue.pop();
cout<<"stack pop"<<endl;
}
}
template<class T>
T mystacks<T>::mins()
{
if (nQueue.size()!=0)
{
return nQueue.top().minValue;
}
else
{
return NULL;
}
}
参考文章:http://blog.csdn.net/lihappy999/article/details/7296173