题目:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
思路:在设计上使用两个栈,一个栈(_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