剑指offer.30 包含min函数的栈
本题主要考察栈结构的使用,压栈和弹栈操作都只需要借用top索引指向数据即可,本题难点在于如何压缩时间为O(1),如果采用遍历栈空间,时间复杂度是O(n),那么我们可以采用辅助栈B来存储最小值,思路如下:
1.栈A(stack1):用来正常存储所有push进栈的数据,执行正常的push(),pop(),top()操作
2.栈B(stack2): 仅当栈B为空栈或新传入数据小于等于B顶端数据时(注意,这里一定是小于等于,而不是小于),将新传入数据同时放入A和B两个栈中,否则只放进A栈,此时B栈顶端数据始终是A栈中所有数据的最小值,因此调用min函数时只需要输出B栈顶端数据即可。
代码如下:
class MinStack {
int stack1[],stack2[];
int top1 = -1;
int top2 = -1;
/** initialize your data structure here. */
public MinStack() {
stack1 = new int[10000];
stack2 = new int[10000];
}
public void push(int x) {
top1++;
stack1[top1] = x;
if (top2 == -1 || x <= stack2[top2] ){
top2++;
stack2[top2] = x;
}
}
public void pop() {
if (stack1[top1] == stack2[top2]){
top2--;
}top1--;
}
public int top() {
return stack1[top1];
}
public int min() {
return stack2[top2];
}
}