您的位置:首页 > 理论基础 > 数据结构算法

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。o(1)空间的代码实现

2012-02-26 20:06 686 查看
2.设计包含min函数的栈(栈)

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。

要求函数min、push以及pop的时间复杂度都是O(1)。

参考了http://blog.csdn.net/anchor89/article/details/6055412#comments的思想,即:

在这个方法里,只需要额外开一个用于存放当前最小值的变量min即可.因此下面提到的push和pop操作都是对于题目中要求的栈来操作的,当然,这也是这个算法里唯一的栈.

设push的参数为v_push,pop的返回值为v_pop.

先说下整体思路:因为栈中所有元素的值都不会小于当其为栈顶元素时min函数的值,所以在栈中其实只需要保存某元素比相应最小值大出来的值就可以了.而对于最小值更新的位置,栈元素肯定为0,因此可以利用这个位置来保存更多的信息,在这里是更新后前两个最小值的差值,而这个值肯定是非正的.

根据上面的思路,push函数按照如下策略进行:

首先push (v_push-min),如果v_push < min,更新min为v_push.

相应的,pop函数按照如下策略进行(称栈顶元素为top):

如果top >= 0, v_pop = min+top, 如果top < 0, v_pop = min,然后更新min为min-top.

显然,对于min函数来说,只需要返回min空间的内容即可.

//coder:LEE

//20120226

#include<iostream>

#include<vector>

#include<CASSERT>

using namespace std;

template <typename T>

class Stack

{

public:

vector<T> value;

T m_min;

public:

const T& min();

void pop();

void push(const T &n);

T getValue();

};

template <typename T>

const T& Stack<T>::min()

{

assert(!value.empty());

return m_min;

}

template <typename T>

void Stack<T>::push(const T &n)

{

if(value.empty())

m_min=n;

T diff=n-m_min;

value.push_back(diff);

if(diff<0)

m_min=n;

}

template <typename T>

void Stack<T>::pop()

{

assert(!value.empty());

T top=value.back();

if(top<0)

m_min-=top;

value.pop_back();

}

template <typename T>

T Stack<T>::getValue()

{

assert(!value.empty());

T originValue;

T top =value.back();

if(top<0)

originValue=m_min;

else

originValue=(top)+m_min;

return originValue;

}

int main()

{

Stack<int> stack;

int b[]={3,4,2,5,6,0};

for(int i=0;i<6;i++)

{

stack.push(b[i]);

cout<<"value:"<<stack.value[i]<<endl;

cout<<"min:"<<stack.m_min<<endl;

cout<<"get_v: "<<stack.getValue()<<endl;

}

return 0;

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