设计包含min函数的栈的理解

题目:

       设计包含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;

}

};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值