数据结构与算法习题---最小栈

最小栈

  1. 支持push、pop、top操作。
  2. 支持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
posted @ 2019-12-08 21:05  狐耳  阅读(163)  评论(0编辑  收藏  举报