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