[剑指offer]面试题21:包含min函数的栈
Posted Wecccccccc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[剑指offer]面试题21:包含min函数的栈相关的知识,希望对你有一定的参考价值。
面试题21:包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。
栈内压入3、4、2、1之后接连两次弹出栈顶数字再压入0时,数据栈、辅助栈和最小值的状态
代码如下:
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
template<typename T>
class StackWithMin
{
public:
void push(const T&value);
void pop();
const T&min();
private:
stack<T>m_data;
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()
{
assert(m_data.size() > 0 && m_min.size() > 0);
return m_min.top();
}
测试用例:
● 新压入栈的数字比之前的最小值大。
● 新压入栈的数字比之前的最小值小。
● 弹出栈的数字不是最小的元素。
● 弹出栈的数字是最小的元素。
本题考点:
● 考查分析复杂问题的思维能力。在面试的时候,很多应聘者都止步于添加一个变量保存最小元素的思路。其实只要举个例子多做几次入栈、出栈的操作就能看出问题,并想到也要把最小元素用另外的辅助栈保存。当我们面对一个抽象复杂的问题的时候,可以用几个具体的例子来找出规律。找到规律之后再解决问题,就容易多了。
● 考查应聘者对栈的理解。
以上是关于[剑指offer]面试题21:包含min函数的栈的主要内容,如果未能解决你的问题,请参考以下文章