最小栈
- 支持push、pop、top操作。
- 支持getMin操作,以O(1)的时间复杂度获取栈中最小值。
方法一、双栈
思路:一个栈存放正常数据,另一个栈存放(历代)最小值。push时判断新加入的元素和最小栈的栈顶元素的大小,若新加入的元素更小,则不仅要压入正常栈,还要压入最小栈;否则仅压入正常栈即可。pop的时候。也要判断一下,弹出栈的元素是否是之前的最小值,如果是,也要在最小栈中将最小值弹出。
注意:这两个栈可以使用同一个数组。
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct stack {
ElemType data[MAXSIZE];
int top1;
int top2;
}*MinStack;
// 初始化最小栈
MinStack Init() {
MinStack ms = (MinStack)malloc(sizeof(struct stack));
if(ms == NULL) return NULL;
ms->top1 = -1;
ms->top2 = MAXSIZE;
return ms;
}
// Push
void Push(MinStack ms, ElemType x) {
if(ms == NULL) return;
if(ms->top1 + 1 = ms->top2) return ;
if(x < ms->data[ms->top2]) {
ms->data[--ms->top2] = x;
}
ms->data[++ms->top1] = x;
}
// Pop
ElemType Pop(MinStack ms) {
if(ms->top1 == -1 || ms->top2 == MAXSIZE) exit(1);
ElemType tmp;
tmp = ms->data[ms->top1--];
if(tmp == ms->data[ms->top2]) {
ms->data[ms->top2++];
}
return tmp;
}
// GetMin
ElemType GetMin(MinStack ms) {
if(ms == NULL) exit(1);
if(ms->top2 == MAXSIZE) exit(1);
return ms->data[ms->top2];
}