題目:定義棧的數據結構,要求添加一個min函數,能夠得到棧的最小元素,並且要求時間複雜度是O(1)。
思路:
1.如何找到一個棧中最小的元素,要遍歷一遍(pop)確定最小元素後再push進去,但這個時間複雜度肯定不對。所以就要想增加空間複雜度來減少時間複雜度。
2.如果我用一個元素來記錄最小元素,貌似可行,但是想到如果記錄最小元素被pop出去後,怎麼才能將最小元素指向第二小元素呢。所以O(1)的額外空間不夠用啊,
所以需要一個O(n)的額外空間來記錄。
3.因爲我的棧是用動態數組實現的,所以我需要額外一個動態數組來記錄當前esp下最大元素的index,然後在min函數中直接返回就行。
代碼如下:
template <class T>
class Stack{
public:
Stack():number(10),top(-1){
storge = new T[number];
minStorge = new int[number];
}
virtual ~Stack(){
delete[] minStorge;
delete[] storge;
}
void addStorge(int length=10){
T* newStorge = new T[capicity+length];
//這裏千萬不要使用memset,這樣會把vitual ptr覆蓋掉,如果T含有虛函數的話
memcpy(newStorge,storge,capicity*sizeof(T));
delete storge;
storge = newStorge;
int* newMinStorge = new int[capicity+length];
memcpy(newMinStorge,minStorge,capicity*sizeof(int));
delete minStorge;
minStorge = newMinStorge;
capicity = capicity+length;
}
T& pop() throw (char*){
if (top<0)
{
throw "emepty stack";
}
return storge[top--];
}
void push(T& ele){
if (top>=capicity)
{
addStorge();
}
top++;
storge[top] = ele;
if (top==0)
{
minStorge[0] = 0;
}
else{
if (storge[top]<storge[minStorge[--top]])
{
minStorge[top] = top;
}
else{
minStorge[top] =minStorge[--top];
}
}
}
const T& min() const throw (char *){
if (top<0)
{
throw "emtpy stack";
}
return storge[minStorge[top]];
}
private:
T* storge;
int *minStorge;
int capicity;
int top;
};