支持最小值的栈设计

题目:

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

思路:在设计上使用两个栈,一个栈(_dataStack)用于存储数据,另一个栈(_minStack)来存储数据中的最小值。

假设当前数据为val,先将val压入_dataStack,再判断_minStack是否为空。如果为空则val也压入_minStack,如果不为空则比较val_minStack栈顶元素的大小,如果val <= _minStack的栈顶元素,则val也压入_minStack,否则不压入_minStack。


#ifndef _MIN_STACK_H_
#define _MIN_STACK_H_

#include <stack>
#include <cstdlib>
#include <iostream>

using namespace std;
template<typename T>
class minStack 
{
public:
	//弹出操作
	T pop()
	{
		T ret = _dataStack.top();
		_dataStack.pop();
		if (ret == _minStack.top())
		{
			_minStack.pop();
		}
		return ret;
	}

	//压栈操作
	void push(T val)
	{
		_dataStack.push(val);
		if (_minStack.empty())
		{
			_minStack.push(val);
		}
		else if (val <= _minStack.top())
		{
			_minStack.push(val);
		}
	}
	//获取栈中的最小值
	T getMinValue()
	{
		return _minStack.top();
	}
	//获取栈size
	int getSize()
	{
		_dataStack.size();
	}
	//栈的其余方法都封装_data提供的方法

private:
	stack<T> _dataStack;
	stack<T> _minStack;
};

#endif

简单的测试用例:

#include <iostream>
#include "minStack.h"
using namespace std;

int main()
{
	minStack<int> ms;
	ms.push(7);
	cout << ms.getMinValue() << endl;
	ms.push(8);
	cout << ms.getMinValue() << endl;
	ms.push(3);
	cout << ms.getMinValue() << endl;
	ms.push(2);
	cout << ms.getMinValue() << endl;
	ms.push(9);
	cout << ms.getMinValue() << endl;
	ms.push(0);
	cout << ms.getMinValue() << endl;
	system("pause");
	return 0;
}


结果:

VS2015:

7

7

3

2

2

0



猜你喜欢

转载自blog.csdn.net/naughfy/article/details/78872304