包含min函数的栈
思路(双栈法)
- 题目要求各个操作的时间复杂度为O(1),由栈的基本操作可知,入栈push,出栈pop,获取栈顶元素top都可以一步完成,时间复杂度为O(1),但获取栈中的最小元素min显然不是一步就能做到的,我们最先想到的肯定是遍历整个栈,找到最小元素,但这样时间复杂度就为O(n)了。
- 因此,我们就需要创建一个辅助栈来存取最小值元素,来达到题目要求
具体步骤
- 首先创建一个辅助栈stMin(辅助栈的栈顶元素用来存储原始栈的最小元素),和它的栈顶指针topMin,并初始化topMin为0
- 每次对原始栈进行入栈push操作时,都将入栈元素value和stMin栈顶元素(原始栈的最小元素)进行比较,如果value大于等于stMin都栈顶元素时,则对stMin的栈顶元素重复入栈1;否则就将value入栈,更新最小值。
- 进行出栈操作pop时,需要同时对原始栈和辅助栈进行pop操作
实现代码
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param value int整型 * @return 无 */ //原始栈 static int stIn[300]; static int topIn = 0; //辅助栈 static int stMin[300]; static int topMin = 0; void push(int value ) { if(value < stMin[topMin - 1] || topMin == 0) //如果辅助栈为空或入栈元素小于最小值 stMin[topMin++] = value; //更新最小值 else { stMin[topMin] = stMin[topMin-1]; //重复入栈 topMin++; } stIn[topIn++] = value; } void pop() { topIn--; topMin--; } int top() { return stIn[topIn-1]; } int min() { return stMin[topMin-1]; }
- 由于栈的元素遵循先进后出原则,如果入栈push的元素value都比stMin的栈顶元素大,却不对stMin的栈顶元素进行重复入栈操作,那么对原始栈和辅助栈同时进行pop操作时,就可能会导致原始栈中的最小元素不等于辅助栈栈顶元素的情况。(读者可自行画图理解)