包含min的栈

来源:互联网 发布:反查域名 编辑:程序博客网 时间:2024/06/18 04:00
/***************************************************************题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)***************************************************************/#include<iostream>#include<stack>#include<assert.h>using namespace std;template<typename T>class minStack{public:void push(const T& data);void pop();const T& min();private:stack<T> m_stackData;stack<T> m_stackMin;};template<typename T>void minStack<T>::push(const T& data){m_stackData.push(data);if(m_stackMin.empty())m_stackMin.push(data);else{if(data<=m_stackMin.top())m_stackMin.push(data);}}template<typename T>void minStack<T>::pop(){assert(!m_stackData.empty() && !m_stackMin.empty());if(m_stackData.top() == m_stackMin.top())m_stackMin.pop();m_stackData.pop();}template<typename T>const T& minStack<T>::min(){assert(!m_stackData.empty() && !m_stackMin.empty());return m_stackMin.top();}void test(){minStack<int> intMinStack;intMinStack.push(5);printf("%d\n",intMinStack.min());intMinStack.push(2);printf("%d\n",intMinStack.min());intMinStack.push(6);printf("%d\n",intMinStack.min());intMinStack.push(7);printf("%d\n",intMinStack.min());intMinStack.push(1);printf("%d\n",intMinStack.min());intMinStack.push(3);printf("%d\n",intMinStack.min());intMinStack.pop();printf("%d\n",intMinStack.min());intMinStack.pop();printf("%d\n",intMinStack.min());intMinStack.pop();printf("%d\n",intMinStack.min());intMinStack.pop();printf("%d\n",intMinStack.min());intMinStack.pop();printf("%d\n",intMinStack.min());intMinStack.pop();}int main(){test();return 0;}

用两个栈来实现包含min函数的栈,一个栈存储数据,另一个存储最小数据集。


template<typename T>class StackWithMin{public:const T&  min() const;void push(const T& data);void pop();private:stack<T> dataStack;stack<T> minStack;};template<typename T>const T& StackWithMin<T>::min() const{return minStack.top();}template<typename T>void StackWithMin<T>::push(const T& data){dataStack.push(data);if(minStack.empty() || data <= minStack.top())//这里||前后两个条件的顺序不能改变{minStack.push(data);}}template<typename T>void StackWithMin<T>::pop(){assert(!minStack.empty() && !minStack.empty());if(!minStack.empty()){if(dataStack.top() == minStack.top())minStack.pop();}if(!dataStack.empty())dataStack.pop();}


0 0