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


    最小栈

    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
    ", min);
      return 0;
    }

    输出:

    Min is 1
  • 相关阅读:
    利用userData实现客户端保存表单数据
    随机提取10条记录
    分页的文本显示
    用VB.NET写的一个简易的RSS阅读器
    怎样提高你的Google Adsense收入?
    全球500家最大公司及网址
    HTC教程
    老百姓是这样买房的
    使用JavaScript+XML实现分页
    恋爱的奇妙感觉,当爱在靠近...
  • 原文地址:https://www.cnblogs.com/hueralin/p/12007215.html
Copyright © 2020-2023  润新知