面试题25:包含min函数的栈
2015-12-17 10:40
441 查看
题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push,pop的时间复杂度都是O(1)。
思路:
可以用一个辅助栈来存储最小值和次小值。当压入的值小于当前最小值,则将该值压入辅助栈,如果最小元素出栈,则也将其从辅助栈中取出。
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push,pop的时间复杂度都是O(1)。
思路:
可以用一个辅助栈来存储最小值和次小值。当压入的值小于当前最小值,则将该值压入辅助栈,如果最小元素出栈,则也将其从辅助栈中取出。
// 《剑指Offer——名企面试官精讲典型编程题》代码 // 著作权所有者:何海涛 #pragma once #include <stack> #include <assert.h> template <typename T> class StackWithMin { public: StackWithMin(void) {} virtual ~StackWithMin(void) {} T& top(void); const T& top(void) const; void push(const T& value); void pop(void); const T& min(void) 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(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(); }
#include <iostream> #include <vector> #include <string> #include <stack> #include <algorithm> using namespace std; #include "StackWithMin.h" int main() { StackWithMin<int> stack; stack.push(3); stack.push(4); stack.push(2); cout << stack.min() << endl; stack.push(3); stack.pop(); stack.pop(); cout << stack.min() << endl; stack.pop(); stack.push(0); cout << stack.min() << endl; return 0; }
相关文章推荐