[LeetCode刷题笔记]155. Min Stack -最小栈的实现方法

本文记录了LeetCode第155题——最小栈的解题思路与实现方法。主要讨论如何在常数时间内获取栈内最小元素,提出了两种策略:1)每次入栈和出栈都同时操作两个栈,一个存储元素,另一个存储最小元素;2)扩展栈结构,增加记录最小值的字段,并详细说明了基于思路1的解决方案。
摘要由CSDN通过智能技术生成

1 题目要求

https://leetcode-cn.com/problems/min-stack/在这里插入图片描述

2 算法思路

由于题目要求在常数时间内检索到最小的元素,那么我们一定要有一个变量,这个变量里面一直存储着现有栈中的最小的元素.
1.可以每次入栈两次,分别存储当前的栈中元素,和当前栈中的最小元素.弹栈操作和这个入栈操作正好对应,每次弹栈弹出两个元素.
2.可以在栈的数据结构中增加一项专门记录最小元素的变量值.

3 算法实现

这里主要是根据思路1进行了实现,由于栈的操作相对比较简单易懂,这里不再做过多的介绍.

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1600
typedef struct 
{
    int *data;
    int top;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() 
{
    MinStack *obj=(MinStack *)malloc(sizeof(MinStack));
    obj->data=(int *)malloc(MAXSIZE*sizeof(int));
    obj->top=-1;    
    return obj;
}
void minStackPush(MinStack* obj, int x)
 {  
    if(obj->top==MAXSIZE-1){        }
    else if(obj->top==-1)
    {
          obj->top++;      
          obj->data[obj->top]=x;      
          obj->top++;      
          obj->data[obj->top]=x;  
    }
    else
    {
          int tmp=obj->data[obj->top];      
          obj->top++;      
          obj->data[obj->top]=x;      
          if(tmp<x)
          {
                  obj->top++;        
                  obj->data[obj->top]=tmp;      
          }
          else
          {
                  obj->top++;        
                  obj->data[obj->top]=x;      
          } 
     }
}
void minStackPop(MinStack* obj) 
{
   if(obj->top==-1){        }
   else
   {
        obj->top--;
        obj->top--;  
    }
}
int minStackTop(MinStack* obj)
{
    if(obj->top==-1)
    {      return;  }  
    return obj->data[obj->top-1];
}
int minStackGetMin(MinStack* obj) 
{  
return obj->data[obj->top];
}
void minStackFree(MinStack* obj)
 {
     free(obj->data);
     obj->data=NULL;
     free(obj);
     obj=NULL;
}
/** 
* Your MinStack struct will be instantiated and called as such: 
* MinStack* obj = minStackCreate(); 
* minStackPush(obj, x); 
*  * minStackPop(obj);  
* * int param_3 = minStackTop(obj);  
* * int param_4 = minStackGetMin(obj);  
* * minStackFree(obj);*/
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值