找堆栈中最小元素 时间复杂度O(1)

题目:O(1)找堆栈中最小元素

思路:(基本思路:空间换时间)

      1.首先先初始化两个堆栈s1,s2 (s1用于正常的堆栈存取,s2用于存放堆栈的最小数据 。
      2. 新建函数spush,(如果堆栈s2为空先入栈),如果新入s1的数据要比已存在s2栈顶的
      数据要小,则再存入s2。
      3.当退出数据时,如果数据和s2栈顶的元素相同,则s2栈顶元素一并弹出。
time:2019/8/21
author by LLQ

代码如下:

#include<stdio.h>
#include<malloc.h>
#include"stack.h"

void Spush(stack *s1,stack *s2,int data){
    push(s1,data);
    if(stackempty(s2))
        push(s2,data);
    if(data<gettop(s2))
        push(s2,data);
}

void Spop(stack *s1,stack *s2){
    if(gettop(s1)==gettop(s2)){
        pop(s1);
        pop(s2);
    }
}
void min(stack *s2){
    printf("当前堆栈最小值:%d\n",gettop(s2));
}
int main(){
    //初始化
    stack s1,s2;
    inistack(&s1);
    inistack(&s2);
    //入栈
    Spush(&s1,&s2,5);
    min(&s2);//检测
    Spush(&s1,&s2,4);
    min(&s2);//检测
    //出栈
    Spop(&s1,&s2);
    min(&s2);//检测
    Spush(&s1,&s2,3);
    Spush(&s1,&s2,2);
    min(&s2);//检测
    Spush(&s1,&s2,1);
    min(&s2);//检测
}

引用的stack.h包如下:

#include <stdio.h>
#include <malloc.h>
#include <string.h>
//******堆栈数据结构******
typedef struct
{
    char *base;
    char *top;
    int size;
}stack;
//******堆初始化 ******
void inistack(stack *A)
{    
    A ->base =(char *)malloc(100*sizeof(char));
    A ->top = A ->base;
    A ->size = 100;    
}
//******判断栈是否为空******
bool stackempty(stack *A)
{
    if(A->top==A->base)
        return true;
    else
        return false;
}
bool push(stack *A,char x)
{
    if(A->top-A->base >=A ->size)
        A->base = (char *)realloc(A ->base, (A->size+10)*sizeof(char));
    *A->top++=x;
        return true;
}
char pop(stack *A)
{
    if(A->top==A->base )
        return 0;
    
    return(*--A->top);
}
char gettop(stack *A)
{
    if(A->top==A->base)
        return 0;
    return *(A->top-1);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值