转自:
http://blog.163.com/kevinlee_2010/blog/static/169820820201092091554523/
问题描述:
对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。
解决方案(1):
在栈的每个元素加一个属性值 min (用于记录当前位置下面的元素的最小值),元素的值用key表示
压栈-Push:当压入的元素key小于当前栈顶元素的min值时,将新压入元素的min字段设置为新压入元素的key,否则,将新压入元素的min字段,设置为当前栈顶元素的min字段的值
(压入第一个元素时,直接设置当前 min <- key)
出栈-Pop:和以前一样删除就行
这样栈顶元素中的min字段,存储的就是栈中的最小值, 删除也不用额外的比较操作~
解决方案(2):
新维护一个栈S2,其栈顶元素用来记录当前栈中最小的元素,具体的Push,Pop和Min函数设计如下:
Min()
1, return S2.top();
Push(key)
1, S1.push(key);
2, if(key<=S2.top())
3, S2.push(key);
3, S2.push(key);
Pop()
1, if (S1=Empty)
1, if (S1=Empty)
2, return "error";
3, key=S1.pop();
4, if(key=S2.top())
5, S2.pop();