题目:定义栈的数据结构,请在该类中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push、及pop的时间复杂度都是O(1)。
分析:要得到当前栈中最小的元素,可以另开辟一个栈,这个栈(下面以minData代替)和原始栈(下面用Data代替)保持同步,minData的顶部元素一直是当前Data中最小的元素,每次向Data中压入数据,都和minData的顶部数据比较,取小的入minData,由数学归纳法可以证得minData最顶部的元素是当前Data中最小的,实现代码如下
1 #include<assert.h> 2 class Solution { 3 public: 4 stack<int> data; 5 stack<int> minData; 6 7 void push(int value) { 8 data.push(value); 9 if(minData.empty()) 10 minData.push(value); 11 else{ 12 int item = minData.top(); 13 minData.push(item>value?value:item); 14 } 15 } 16 void pop() { 17 assert(data.size()>0 && minData.size()>0); 18 data.pop(); 19 minData.pop(); 20 } 21 int top() { 22 assert(data.size()>0); 23 return data.top(); 24 } 25 int min() { 26 assert(minData.size()>0); 27 return minData.top(); 28 } 29 };
: