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

落花浮王杯 提交于 2019-12-08 21:26:27

最小栈

  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(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];
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!