数据结构与算法习题---最小栈
最小栈
- 支持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(ms->top2 == MAXSIZE) {
ms->data[--ms->top2] = x;
} else 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->top2++; } return tmp; } // GetMin ElemType GetMin(MinStack ms) { if(ms == NULL) exit(1); if(ms->top2 == MAXSIZE) exit(1); return ms->data[ms->top2]; }
主程序
int main() { MinStack ms = Init(); int min; Push(ms, 4); Push(ms, 1); Push(ms, 5); Push(ms, 3); Push(ms, 2); min = GetMin(ms); printf("Min is %d\n", min); return 0; }
输出:
Min is 1