求栈中元素的最小值c语言,[leetcode]Min Stack (获取栈的最小元素C语言实现)

Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

push(x) – Push element x onto stack.

pop() – Removes the element on top of the stack.

top() – Get the top element.

getMin() – Retrieve the minimum element in the stack.

题目意思:设计一个栈,让它能实现push,pop,top,并同时能获取栈元素的最小值。

push(x)–压栈

pop()–出栈

top()–获取栈顶元素

getMin()–获取栈的最小元素

解题思路:要求压栈、出栈、寻找栈中最小值的时间复杂度都是O(1),所以按照网友博客给的资料需要申请两个栈,一个用于正常的存储数据(data数组),另一个用于存储最小值(min数组),并设置相应两个栈的栈顶指针,对于压栈和出栈的时间复杂度当然是O(1),但难点在getMin获取栈的最小值,若使用一般的求数组的最小值算法,其时间复杂度为O(n),所以不符合题意对于min数组用于存储data栈的最小值,当push数据进data数组时同时和min数组的栈顶元素进行比较,若大于min的栈顶元素则不压入min数组内,否则同时压入min数组中,这样getMin()就直接从min数组中的栈顶读取,时间复杂度为O(1)。

难点:不容易想到用两个栈来存储数据,一个用于正常的存储栈数据,,另一个用于存储前一个栈的最小值。

实现C代码:

/**

* 解题思路:要求压栈、出栈、寻找栈中最小值的时间复杂度都是O(1),所以按照网友博客给的资料

* 需要申请两个栈,一个用于正常的存储数据(data数组),另一个用于存储最小值(min数组),

* 并设置相应两个栈的栈顶指针,对于压栈和出栈的时间复杂度当然是O(1),但难点在getMin获取栈的最小值,

* 若使用一般的求数组的最小值算法,其时间复杂度为O(n),所以不符合题意

* 对于min数组用于存储data栈的最小值,当push数据进data数组时同时和min数组的栈顶元素进行比较,若

* 大于min的栈顶元素则不压入min数组内,否则同时压入min数组中

* 这样getMin()就直接从min数组中的栈顶读取,时间复杂度为O(1)。

*

*/

typedef struct {

int data[20000];//初始化时给定栈大小为20000

int min[20000];//同时让min的大小也为20000,防止压入data的全是一样的数据

int top;//data的栈顶指针

int mintop;//min的栈顶指针

} MinStack;

void minStackCreate(MinStack *stack, int maxSize) {//栈的大小初始化已经在创建栈的时候给定了,本人设置的是20000大小,不用管maxSize

stack->top = -1;

stack->mintop = -1;

memset(stack->data, 0, 20000);

memset(stack->min, 0 ,20000);

}

void minStackPush(MinStack *stack, int element) {//压入data时同时把最小值也压入min数组

if(stack->top < 19999){

stack->top++;

stack->data[stack->top] = element;

if(stack->mintop == -1 || element <= stack->min[stack->mintop]){

stack->mintop++;

stack->min[stack->mintop] = element;

}

}else{

return;

}

}

void minStackPop(MinStack *stack) {//删除data栈顶元素时,同时比较data栈顶元素值是否等于min数组的栈顶元素值,若相等则min数组出栈

int temp, temp1;

if(stack->top == -1){

return;

}

temp = stack->data[stack->top];

stack->top--;

if(temp == stack->min[stack->mintop]){

temp1 = stack->min[stack->mintop];

stack->mintop--;

}

}

int minStackTop(MinStack *stack) {

return stack->data[stack->top];

}

int minStackGetMin(MinStack *stack) {//这里直接获取min数组的栈顶元素,也就是data数组的最小值

return stack->min[stack->mintop];

}

void minStackDestroy(MinStack *stack) {//不用管这个函数

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值