#include <stdio.h>
#include <stdlib.h>
/*
当堆中元素很多的时候,常规方法判断堆中最小值的事件复杂度是O(n);
这道题的要求是事件复杂度是O(1),也就是一下子就能找到,不需要进行重复的操作
用到了一个重要的思想: 空间换时间
就是在顺序存储到栈的时候,同时定义一个辅助栈;前者正常存储,后者的栈,值存储当前最小的。以此类推,辅助栈的栈顶就是最小值
O(n) : 遍历 (随着输入的增加而增加)
O(1) :高斯函数(不管输入有多少,都能一下子算出)
*/
/*定义栈结构体*/
typedef struct Stack{
int len;
int top;
int min;
int *space;
}Stack;
/*初始化栈*/
void initStack(Stack *s,int len)
{
s->len = len;
s->top = 0;
s->min = 0;
s->space = (int *)malloc(sizeof(int)*len);
}
/*入栈*/
void inStack(Stack *s,int ch)
{
if(s->top == 0 || s->min > ch)
s->min = ch;
s->top++;
}
/*出栈*/
int deStack(Stack *s)
{
return s->space[--s->top];
}
int min(Stack *s)
{
return s->min;
}
int main(void)
{
int data,i,mindata;
Stack stack;
initStack(&stack,5);
for(i=0;i<5;i++)
{
scanf("%d",&data);
printf( "Push Number %d \n",data);
inStack(&stack,data);
}
mindata = min(&stack);
printf( "min is = %d \n",mindata);
return 0;
}
包含min函数的栈 (C语言)
最新推荐文章于 2022-02-12 14:56:29 发布