//How would you design a stack which, in addition to push and pop, also has a function
//min which returns the minimum element? Push, pop and min should all operate in
//O(1) time.
#include <math.h>
#define MAX_VALUE 2147483647
struct StackNode {
int value;
StackNode * next;
int minValue;
StackNode(int _v, StackNode * _n, int _m)
{
value = _v;
next = _n;
minValue = -m;
}
StackNode(int _v, int _m)
{
StackNode(_v, NULL, -m);
}
};
class StackMin{
private:
StackNode * head;
public:
StackMin();
~StackMin();
void push(int value);
int pop();
bool isEmpty();
int top();
int getMinValue();
};
StackMin::StackMin()
{
head = NULL;
}
StackMin::~StackMin()
{
while (head)
{
StackNode * n = head;
head = head->next;
delete n;
}
}
void StackMin::push(int value)
{
int minValue = getMinValue();
StackNode * node = new StackNode(value, min(value, minValue));
if (head == NULL)
head = node;
else
{
node->next = head;
head = node;
}
}
int StackMin::pop()
{
if (head == NULL)
{
cout<<" Error pop"<<endl;
return -1;
}
StackNode * node = head;
head = head->next;
delete node;
}
bool StackMin::isEmpty()
{
return head == NULL;
}
int StackMin::getMinValue()
{
if (isEmpty())
return MAX_VALUE;
else
return head->minValue;
}
这道题给了两个答案,其实第二个答案是不对的。虽然第二个答案减少了冗余最小值的存储,但是他不能够保证删除一个值后,所得到的最小值是正确的最小值。所以还是应该在每个节点中保存当前最小值。