[剑指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函数的栈的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer——面试题30. 包含min函数的栈》代码

剑指offer-面试题30-包含min函数的栈-栈

剑指Offer - 面试题30:包含min函数的栈

剑指Offer系列之题21~题25

剑指Offer对答如流系列 - 包含min函数的栈

剑指offer 面试30题