您的位置:首页 > 职场人生

剑指offer——面试题21:包含min函数的栈(泛型编程,一个巧妙的思维)

2015-08-12 22:20 513 查看
题目:定义栈的数据结构,请在该类型中实现一个能够得到该栈的最小元素的min函数,在该栈中

调用min,push以及pop的时间复杂度都是O(1)

思路:

这题要求时间复杂度为O(1),所以需要一个很巧妙的方法,在这道题中,需要在每次min时

得到一个最小值,并且是当前最小的。

所以可以维护一个辅助栈sta2.一个主要存数据的栈sta1

push时,sta1直接压入,而sta2,当压入的数据大于当前的最小时,将那个当前的sta2的栈顶元素

再压入一次

pop时 sta1和sta2都pop

求最小min时,就是sta2的栈顶元素

#include<iostream>
#include<stack>
using namespace std;

template<typename T>
class stack_min
{
public:
stack<T> sta1;
stack<T> sta2;
void push(const T& a);
void pop();
T min();
};

template<typename T> void stack_min<T>::push(const T& a)
{
sta1.push(a);
if(sta2.size()==0||sta2.top()>a)
sta2.push(a);
else
sta2.push(sta2.top());
}

template<typename T> void stack_min<T>::pop()
{
if(sta1.empty())
return;
sta1.pop();
sta2.pop();
}

template<typename T> T stack_min<T>::min()
{
if(sta2.empty())
exit(100);
return sta2.top();
}

int main()
{
stack_min<int> stamin;
stamin.push(1);
stamin.push(3);
stamin.pop();
stamin.push(4);
stamin.pop();
stamin.pop();
cout<<stamin.min()<<endl;

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: