栈和队列面试题之--实现一个有getMin功能的栈
2016-07-20 09:44
323 查看
题目:实现一个特殊的栈,在实现栈基本功能的的基础上,再实现返回栈中的最小元素操作
要求:pop push getMin操作的时间复杂度都是O(1)
看到题目可以想到大体分为两种思路,一是通过一个栈来实现;二则是通过两个栈来实现
我先实现用一个栈的
用一个栈的话就要一次压入两个值,data值,和记录的最小值Min,
方法是:向一个stack中压入数据data,第一次由于栈是空的,所以第一次压入的Min就是data,此时保存栈顶数据top;然后再向其中压入第二个数据,如果第二个数据大于第一个,则压入data之后再次压入top,如果第二个数据小于第一个则和第一次压入时一样。
pop的时候是直接pop栈顶元素即可,但是要记得判空的条件
代码实现如下:
当然我是先压入data在压入min的这样的话第一次出栈取的直接是最小值,比较方便
其实也可以定义一个结构体,里面存入两个数据,其它的操作与上面的类似
第二种是用两个栈,我觉得这种更加方便
data栈值用来压入数据,而min栈用来记录最小值,第一次是将data放入min栈 然后再次压入data的时候与min的栈顶进行比较,若大于就在min栈中重复压入min的栈顶元素,否则压入data;最后的min的栈顶元素即为最小值
要求:pop push getMin操作的时间复杂度都是O(1)
看到题目可以想到大体分为两种思路,一是通过一个栈来实现;二则是通过两个栈来实现
我先实现用一个栈的
用一个栈的话就要一次压入两个值,data值,和记录的最小值Min,
方法是:向一个stack中压入数据data,第一次由于栈是空的,所以第一次压入的Min就是data,此时保存栈顶数据top;然后再向其中压入第二个数据,如果第二个数据大于第一个,则压入data之后再次压入top,如果第二个数据小于第一个则和第一次压入时一样。
pop的时候是直接pop栈顶元素即可,但是要记得判空的条件
代码实现如下:
template <typename T> class getStackMin { public: getStackMin() {} void Push(const T&data) { if (s.empty()||data<s.top()) { s.push(data); s.push(data); } else { T minData = s.top(); s.push(data); s.push(minData); } } void pop() { assert(!s.empty()); s.top(); s.pop(); } T& top() { T minData = s.top(); s.pop(); T& ret = s.top(); return ret; }
当然我是先压入data在压入min的这样的话第一次出栈取的直接是最小值,比较方便
其实也可以定义一个结构体,里面存入两个数据,其它的操作与上面的类似
struct Elem { T minData; T data; };
第二种是用两个栈,我觉得这种更加方便
data栈值用来压入数据,而min栈用来记录最小值,第一次是将data放入min栈 然后再次压入data的时候与min的栈顶进行比较,若大于就在min栈中重复压入min的栈顶元素,否则压入data;最后的min的栈顶元素即为最小值
//#include<stack> //#include<iostream> //using namespace std; //class solution //{ // stack<int> StackData; // stack<int>StackMin; // void Push(int data) // { // StackData.push(data); // if (StackMin.empty()) // { // StackMin.push(data); // } // else // { // if (data<StackData.top()) // { // StackMin.push(data); // } // else // { // StackMin.push(StackMin.top); // } // } // } // void Pop() // { // StackData.pop(); // StackMin.pop(); // } // int top() // { // return StackData.top(); // } // int MinData() // { // return StackData.top(); // } //};