一、实现一个栈,要求Push(入栈),Pop(出栈),Min(返回最小值的操作)的时间复杂度为O(1)。
思想:
创建一个栈,栈中保存着入栈的值和当前栈中的最小值,每次入栈时都入栈两个值,在入栈时先比较要插入的值与栈顶值得大小,通过打擂台的思想循环去比较,最终栈顶元素就是整个栈的最小值
注意:入栈最小值与当前值时,必须先入栈当前值在入栈最小值,这样才能保证栈顶元素最小
例如:序列 9 5 2 7 入最小栈
代码实现:
#include <stdio.h> #include <stdlib.h> #include "seqstack.h" typedef struct MinStack{ SeqStack stack;//结构体变量 }MinStack; void MinStackInit(MinStack* min_stack){ if(min_stack == NULL){ return; } SeqStackInit(&min_stack->stack); } void MinStackPush(MinStack* min_stack,SeqStackType value){ if(min_stack == NULL){ //非法输入 return; } SeqStackType min = value; SeqStackType top; int ret = SeqStackTop(&min_stack->stack,&top); if(ret == 0){ //当前是空栈 return; }else { //如果是非空 min = top < value ? top:value; } //先插入value,再插入min,才能保证栈顶为最小值 SeqStackPush(&min_stack->stack,value); SeqStackPush(&min_stack->stack,min); return; } void MinStackPop(MinStack* min_stack){ if(min_stack == NULL){ //非法输入 return; } SeqStackPop(&min_stack->stack); SeqStackPop(&min_stack->stack); } int MinStackTop(MinStack* min_stack,SeqStackType* value){ if(min_stack == NULL || value == NULL){ //非法输入 return 0; } return SeqStackTop(&min_stack->stack,value); }test.c
扫描二维码关注公众号,回复:
1028698 查看本文章
#include <stdio.h> #define TEST_HEADER printf("\n====================================%s===================================\n",__FUNCTION__) void TestMinStack(){ TEST_HEADER; MinStack min_stack; MinStackInit(&min_stack); MinStackPush(&min_stack,'a'); MinStackPush(&min_stack,'b'); MinStackPush(&min_stack,'c'); MinStackPush(&min_stack,'d'); SeqStackType value; int ret; ret = MinStackTop(&min_stack,&value); printf("ret expected 1,actual %d\n",ret); printf("value expected a,actual %c\n",value); } int main(){ TestMinStack(); return 0; }