微软100题(2) min函数栈

来源:互联网 发布:淘宝店铺招牌模板下载 编辑:程序博客网 时间:2024/06/03 23:01
2.设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。

要求函数min、push 以及pop 的时间复杂度都是O(1)。

要能在O(1)时间拿到min值,则栈中每个位置都应该有关于最小值的信息,否则无法直接获得最小值

所以,有两种思路,一是栈中每个值为一个结点,节点包括当前value和min值,另一种则借助辅助栈,使得辅助栈中只保存对应的min信息

思路一:

struct MinStackElement{ int data; int min;};struct MinStack{ MinStackElement *data; int top; int size;};MinStack MinStackInit(int max_size){ MinStack stack; stack.size=max_size; stack.data=(MinStackElement*)malloc(sizeof(MinStackElement)*max_size); stack.top=0; return stack;}void freeMinStack(MinStack stack){ free(stack.data); stack.top=0;}void MinStackPush(MinStack stack,int d){ if(stack.top==stack.size) cout<<"error"; MinStackElement *p=stack.data[stack.top]; p->data=d; p->min=(stack.top==0?d:stack.data[top-1]); if(p->min>d) p->min=d; top++;}int MinStackPop(MinStack stack){ if(top==0) cout<<"empty"; return stack.data[--stack.top].data;}int MinStackMin(MinStack stack){ if(top==0) cout<<"empty"; return stack.data[stack.top-1].min;}

思路二:借助辅助栈

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();}




0 0
原创粉丝点击