剑指offer30. 包含min函数的栈 P165

mac2025-07-28  5

剑指offer30. 包含min函数的栈 P165

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。

构造一共辅助栈min,栈顶是当前数据栈data中的最小元素。 即:每次数据num入数据栈data时,把num和当前min栈顶元素tip比较,存入较小的那个到min栈(只把栈顶做比较,不要弹栈;假如栈顶小,再压入一个栈顶元素,否则,压入num)

template <typename T> class StackWithMin { public: StackWithMin() {} virtual ~StackWithMin() {} T& top(); const T& top() const; void push(const T& value); void pop(); const T& min() const; bool empty() const; size_t size() const; private: std::stack<T> m_data; // 数据栈,存放栈的所有元素 std::stack<T> m_min; // 辅助栈,存放栈的最小元素 }; template <typename T> void StackWithMin<T>::push(const T& value) { // 把新元素添加到辅助栈 m_data.push(value); // 当新元素比之前的最小元素小时,把新元素插入辅助栈里; // 否则把之前的最小元素重复插入辅助栈里 if(m_min.size() == 0 || value < m_min.top()) m_min.push(value); else m_min.push(m_min.top()); } template <typename T> void StackWithMin<T>::pop() { //assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。 assert(m_data.size() > 0 && m_min.size() > 0); m_data.pop(); m_min.pop(); } template <typename T> const T& StackWithMin<T>::min() const { assert(m_data.size() > 0 && m_min.size() > 0); return m_min.top(); } template <typename T> T& StackWithMin<T>::top() { return m_data.top(); } template <typename T> const T& StackWithMin<T>::top() const { return m_data.top(); } template <typename T> bool StackWithMin<T>::empty() const { return m_data.empty(); } template <typename T> size_t StackWithMin<T>::size() const { return m_data.size(); }
最新回复(0)