题目:
设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1).
理解: 为了满足三个函数的时间复杂度都是O(1),该栈类设计了2个链表,分别保存数据和最小数据,但是增大了系统的空间开销,空间换时间
如果去掉时间复杂度,则只用一个链表,最小遍历即可
构造函数中整型变量不需要添加const 和 &,效果一样
代码引用lyceum的算法:
class Stack{
private:
struct Link
{ int data;
Link* next;
Link(const int& dat, Link* nxt):data(dat), next(nxt){}
~Link(){}
} *pHead;
Link *pMinimum;
public:
Stack():pHead(NULL), pMinimum(NULL){}
Stack(const int& initial)
{
pHead = new Link(initial, NULL);
pMinimum = new Link(initial, NULL);
}
~Stack()
{
Link* tmpNode = NULL;
while(pHead != NULL)
{
tmpNode = pHead;
pHead = pHead->next;
delete tmpNode;
tmpNode = NULL;
}
while(pMinimum != NULL)
{
tmpNode = pMinimum;
pMinimum = pMinimum->next;
if(tmpNode != NULL)
{
delete tmpNode;
tmpNode = NULL;
}
}
}
bool push(const int& newData)
{
pHead = new Link(newData, pHead);
if(pMinimum == NULL || pMinimum->data >= newData)
{
pMinimum = new Link(newData, pMinimum);
}
return true;
}
bool pop(int& iData)
{
if(pHead == NULL)
{
return false;
}
iData = pHead->data;
Link* tmpNode = pHead;
pHead = pHead->next;
delete tmpNode;
if(iData == pMinimum->data)
{
tmpNode = pMinimum;
pMinimum = pMinimum->next;
delete tmpNode;
}
return true;
}
bool min(int& iMinimum) const
{
if(pMinimum == NULL)
{
return false;
}
iMinimum = pMinimum->data;
return true;
}
bool empty() const
{
return pHead == NULL;
}
};
优化:
1, 在结构中添加一个存储最小值的变量(红色),即可省去构造存储最小值链表
class Stack{
private:
struct Link
{
int data;
int mindata; // add the in struct
Link* next;
Link(int dat, int mindat, Link* nxt):data(dat), mindata(mindat), next(nxt){}
~Link(){}
} *pHead;
public:
Stack():pHead(NULL), pMinimum(NULL){}
Stack(const int& initial)
{
pHead = new Link(initial, initial, NULL);
//pMinimum = new Link(initial, NULL);
}
~Stack()
{
Link* tmpNode = NULL;
while(pHead != NULL)
{
tmpNode = pHead;
pHead = pHead->next;
delete tmpNode;
tmpNode = NULL;
}
/*
while(pMinimum != NULL)
{
tmpNode = pMinimum;
pMinimum = pMinimum->next;
if(tmpNode != NULL)
{
delete tmpNode;
tmpNode = NULL;
}
}*/
}
bool push(const int& newData)
{
if (pHead != NULL)
{
if (pHead->value < newData)
{
pHead = new Link(newData, pHead->value);
return true;
}
}
pHead = new Link(newData, newData, pHead);
/*
if(pMinimum == NULL || pMinimum->data >= newData)
{
pMinimum = new Link(newData, pMinimum);
}*/
return true;
}
bool pop(int& iData)
{
if(pHead == NULL)
{
return false;
}
iData = pHead->data;
Link* tmpNode = pHead;
pHead = pHead->next;
delete tmpNode;
tmpNode = NULL;
/*
if(iData == pMinimum->data)
{
tmpNode = pMinimum;
pMinimum = pMinimum->next;
delete tmpNode;
}*/
return true;
}
bool min(int& iMinimum) const
{
if(pHead == NULL)
{
return false;
}
iMinimum = pHead->mindata;
return true;
}
bool empty() const
{
return pHead == NULL;
}
};