【面试题】实现一个栈要求Push,Pop,Min(返回栈中最小值的操作)的时间复杂度为O(1)

思路:

用两个栈来实现,栈sData存放入栈元素,栈sMin存放最小值。


按照元素入栈顺序,将要入栈的第一个元素,同时压入两个栈中。后续每个元素入栈时,与sMin栈中栈顶元素比较大小,若入栈元素data 小于sMin栈顶元素,则把data同时压入两个栈中,若data大于sMin栈中栈顶元素,则只压入栈sData中。出栈时,判断两个栈顶元素是否相等,若相等则两个栈同时执行出栈操作,不相等则,只有栈sData执行出栈操作。


如:先入栈序列依次为 5 3 2 4 6 1 3

①.

【面试题】实现一个栈要求Push,Pop,Min(返回栈中最小值的操作)的时间复杂度为O(1)_第1张图片

②.

【面试题】实现一个栈要求Push,Pop,Min(返回栈中最小值的操作)的时间复杂度为O(1)_第2张图片

③.

【面试题】实现一个栈要求Push,Pop,Min(返回栈中最小值的操作)的时间复杂度为O(1)_第3张图片

④.

【面试题】实现一个栈要求Push,Pop,Min(返回栈中最小值的操作)的时间复杂度为O(1)_第4张图片

出栈的话如果相等就同时出栈,否则只出栈sData中的元素

代码如下:

#include 
#include 
using namespace std;


template 
class MinStack
{
public:
	// 入栈
	void push(const T& data)
	{
		// 第一个元素同时压入两个栈
		if (sData.empty())
		{
			sData.push(data);
			sMin.push(data);
		}
		else
		{
			if (data < sMin.top())
			{
				sData.push(data);
				sMin.push(data);
			}
			else
			{
				sData.push(data);
			}
		}
	}

	void pop()
	{
		// 栈顶元素相等同时出栈
		if (sMin.top() == sData.top())
		{
			sData.pop();
			sMin.pop();
		}
		else
		{
			sData.pop();
		}
	}

	T min()
	{
		return sMin.top();
	}
private:
	stack sData;
	stack sMin;
};

int main()
{

	MinStack s;
	s.push(5);
	s.push(3);
	s.push(2);
	s.push(4);
	s.push(6);
	s.push(3);
	s.push(1);
	cout << s.min() << endl;
	s.pop();
	cout << s.min() << endl;
	s.pop();
	cout << s.min() << endl;
	s.pop();
	cout << s.min() << endl;
	s.pop();
	cout << s.min() << endl;
	s.pop();
	cout << s.min() << endl;
	s.pop();

	return 0;
}

打印结果:

1
2
2
2
2
3



你可能感兴趣的:(C/C++,C/C++/数据结构)