zoukankan      html  css  js  c++  java
  • 数据结构与算法习题---最小栈

    最小栈

    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
  • 相关阅读:
    协议
    网页制作
    知识点--------二维数组
    方法---------拖延,清屏,前景色,背景色
    小知识点------遍历数组、switch case、do while
    知识点-----------函数
    循环经典--------冒泡排序,查找。
    知识点-------一维数组
    循环语句-----经典案例
    知识点--循环语句
  • 原文地址:https://www.cnblogs.com/hueralin/p/12007215.html
Copyright © 2011-2022 走看看