设计一个有getMin功能的栈(C++版)

题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求:pop、push、getMin操作的时间复杂度都是O(1)

这个题我们有两种解决办法,如下:

1.使用两个栈,一个栈用来保存当前的元素,记做:stackData,一个栈用来保存压入操作每一步的最小元素,记做:stackMin。

入栈:当stackData栈中压入一个数据时,判断satckMin中是否为空。若为空,将该元素压入stackMin栈中。若不空,判断两者之间的大小,当前者小于或等于后者时,将前者中的数据压入后者中;当前者大于后者时,则将stackMin栈顶的元素再压入该栈中。

出栈:两个栈的栈顶元素同时弹出。

代码实现:

class Stack
{
public:
	void Push(int data)
	{
		stackData.push(data);
		if (stackMin.empty())
		{
			stackMin.push(data);
		}
		else
		{
			int a = stackMin.top();
			int b = data > b ? a : data;
			stackMin.push(b);
		}
	}
	void Pop()
	{
		assert(!stackData.empty() && !stackMin.empty());
		stackData.pop();
		stackMin.pop();
	}
	int getMin()
	{
		assert(!stackMin.empty());
		stackMin.top();
	}
private:
	stack stackData;
	stack stackMin;
};

这种实现方式有一个问题,就是占用内存空间太大,栈内进行了多次重复操作,所以我们还有下面的一种实现方法。

2.同样使用两个栈,一个栈用来保存当前的元素,记做:stackData,一个栈用来保存压入操作每一步的最小元素,记做:stackMin。

入栈:入栈操作与上述情况有相同之处,唯一的不同就是当satckMin栈中的元素小于satckData中的元素时不进行任何操作。

出栈:要保证stackMin中栈顶的元素是sattckData中最小的,这个原则,其他与上一种思路保持不变。

代码实现如下:

class Stack
{
public:
	void Push(int data)
	{
		stackData.push(data);
		if (stackMin.empty())
		{
			stackMin.push(data);
		}
		else
		{
			if (stackData.top()< stackMin.top())
			{
				stackMin.push(data);
			}
		}
	}
	void Pop()
	{
		assert(!stackData.empty() && !stackMin.empty());
		if (stackData.top() == stackMin.top())
		{
			stackMin.pop();
		}
		else
			stackData.pop();
	}
	int getMin()
	{
		assert(!stackMin.empty());
		stackMin.top();
	}
private:
	stack stackData;
	stack stackMin;
};

你可能感兴趣的:(数据结构与算法)