您的位置:首页 > 运维架构

实现一个栈,要求push(入栈),pop(出栈),min(返回栈中的最小值)的时间复杂度为O(1);

2016-07-30 22:11 417 查看

1. 栈的基本操作

入栈(push);
出栈(pop);
查找栈顶(top);
栈的元素个数(size);
检查栈是否为空(empty);

2.时间复杂度为o(1);

方法一

每次入栈时,先把元素入栈 ,然后和栈顶(s.top)与入栈的元素比较,把较小(相等)的的再入栈一次;
保证栈顶的元素是最小的。
出栈时,每次出两个,如果出的两个相等,即最小值min;

方法二

使用两个栈,s1,s2,先将第一个元素同时对s1,s2入栈,然后接着对s1入栈,将s1入栈的元素和s2.top比较,假如s2.top大, 则把该元素对s2也入栈; 否则进行下一个元素de入栈,依次进行;
出栈时,把s1出栈的元素和栈顶(s2.top)比较,相等就是最小值;同时s1,s2出栈,否则s1单独出栈。
代码:
template<typename T>

class Stackmin

{

public:

Stackmin()

{}

~Stackmin()

{}

void Push(T data)

{

s1.push(data);

if (s2.empty()||s2.top()>=data)

{

s2.push(data);

}

}

void Pop()

{

if (s1.top()==s2.top())

{

s2.pop();

}

s1.pop();

}

void Min()

{

if (!s2.empty())

{

cout<<"最小值"<<s2.top()<<endl;

}

}

void Print()

{

while (!s1.empty())

{

cout << s1.top() << "->";

s1.pop();

}

cout << endl;

while (!s2.empty())

{

cout << s2.top() << "->";

s2.pop();

}

cout << endl;

}

private:

stack<T> s1, s2;

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐