题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈中,调用 min、push 及 pop 的时间复杂度都是 0(1)
分析
要在O(1)的时间获取最小元素,需要将这个最小元素保存下来。但只用一个变量去保存最小的元素可以吗?如果在使用栈的过程中将这个最小元素pop出去了,因为栈中的元素是无序的,则无法在O(1)的时间找到第二小的值做为最小元素。
因此我们要么要将栈中的元素在push的过程中排序,要么需记录栈的每一个位置所对应的的最小值,具体做法是借助一个辅助栈,在辅助栈的同一位置上push进一个原栈从栈底至该位置的最小值。辅助栈的栈顶元素永远是最小的,每次push新元素后,
如果新元素比辅助栈顶元素小,将该元素也push进辅助栈,反之,仍push原最小元素。过程中保持辅助栈和原栈大小一致。
代码
1 template <typename T> 2 void ReverseStack(stack<T>& st); 3 4 template <typename T> class minStack 5 { 6 public: 7 minStack(); 8 ~minStack(); 9 10 public: 11 void minpush(const T& value); 12 void minpop(); 13 T& mintop(); 14 T& getMin(); 15 16 public: 17 stack<T> st; 18 stack<T> asis_st; 19 };
1 template <typename T> void minStack<T>::minpush(const T& value) 2 { 3 if (asis_st.empty()) 4 { 5 st.push(value); 6 asis_st.push(value); 7 }else 8 { 9 T min=asis_st.top(); 10 asis_at.push(min<value?min:value); 11 st.push(value); 12 } 13 } 14 15 template <typename T> void minStack<T>::minpop() 16 { 17 if (!st.empty()) 18 { 19 st.pop(); 20 asis_st.pop(); 21 } 22 } 23 24 template <typename T> T& minStack<T>::mintop() 25 { 26 return st.empty()?NULL:st.top(); 27 } 28 29 template <typename T> T& minStack<T>::getMin() 30 { 31 return asis_st.empty()?NULL:asis_st.top(); 32 }