题目:MinStack
要求:
实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。
你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。
注意事项
如果堆栈中没有数字则不能进行min方法的调用
样例:
如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1
算法要求:
无
解题思路:
这道题有二种常规的算法,一种是额外用一个辅助栈存最小值;另一种就是将栈值都存为与最小值的差,因为一次只能出栈一个数,所以我们只需要适时的改变minNumber的值就可以了(第二种方法目前适用于数字),在push的时候,我们将小于当前最小值的数,存为负数,值为二数之差,这样在pop的时候就可以根据是否为负数来判断是否需要变为上一个最小值,即栈值为负数时,当前最小值为实际的栈值,负数的值为为比上一个最小值小多少。相当于,每个数都记录了上一个push前的最小值。
下面给出第二种方法,第一种方法实现非常简单,请读者自行实现。
算法如下:
class MinStack {
public:
MinStack() {
top = -1;
numStack = new int[100];
}
void push(int number) {
if (top == 99) {
throw top;
}
if (top == -1) {
minNumber = number;
numStack[++top] = 0;
} else if (number < minNumber) {
numStack[++top] = number - minNumber;
minNumber = number;
} else {
numStack[++top] = number - minNumber;
}
}
int pop() {
if (top == -1) {
throw top;
}
if (numStack[top] >= 0) {
return numStack[top--] + minNumber;
} else {
minNumber = minNumber - numStack[top];
return minNumber + numStack[top--];
}
}
int min() {
if (top == -1) {
throw top;
}
return minNumber;
}
~MinStack() {
delete numStack;
}
private:
int *numStack;
int top;
int minNumber;
};