解题思路:
每次入栈两个元素,一个为将要入栈的value元素,一个位min最小元素。
第一次入栈时,将该元素设为min值,入栈两次该元素。此后,每次入栈value都需和min值比较,若比min值小,则min数据更新为该值。若大于min,则min不变。
此后,先入栈value元素,后入栈min。这样就保证了栈顶元素始终为最小值min。
下面上代码:
#include"minStack.h"
void minStackInit(minStack* stack)
{
if(stack == NULL)
{
//非法输入
return;
}
stack->size = 0;
stack->capacity = 1000;
stack->data = (minStackType*)malloc(stack->capacity * sizeof(minStackType));
}
void minStackDestroy(minStack* stack)
{
if(stack == NULL)
{
//非法输入
return;
}
free(stack->data);
stack->size = 0;
stack->capacity = 0;
return;
}
void minStackPrint(minStack* stack,char* msg)
{
printf("[%s]\n",msg);
if(stack == NULL)
{
//非法输入
return;
}
if(stack->size == 0)
{
//空栈
return;
}
int i = 0;
for(;i < stack->size;i++)
{
printf("%c ",stack->data[i]);
}
printf("\n");
}
void minStackPush(minStack* stack,minStackType value)
{
if(stack == NULL)
{
//非法输入
return;
}
if(stack->size >= stack->capacity)
{
//栈已满
return;
}
//假设要插入的值就是最小值
minStackType min = value;
if(stack->size == 0)
{
stack->data[stack->size++] = value;
stack->data[stack->size++] = min;
return;
}
if(stack->data[stack->size] < min)
{
//如果栈顶元素小于min,则让min的值为栈顶元素
min = stack->data[stack->size - 1];
}
//先入栈value,再入栈min,确保min在栈顶
stack->data[stack->size++] = value;
stack->data[stack->size++] = min;
}
void minStackPop(minStack* stack)
{
if(stack == NULL)
{
//非法输入
return;
}
if(stack->size == 0)
{
//空栈
return;
}
stack->size -= 2;
return;
}
int minStackGet(minStack* stack,minStackType* value)
{
if(stack == NULL)
{
//非法输入
return 0;
}
if(stack->size == 0)
{
//空栈
return 0;
}
*value = stack->data[stack->size-1];
return 1;
}
// 以下为测试函数 //
void TestminStackPush()
{
TITLE;
minStack stack;
minStackInit(&stack);
minStackPush(&stack,'a');
minStackPrint(&stack,"入栈一个元素");
minStackPush(&stack,'c');
minStackPush(&stack,'d');
minStackPrint(&stack,"再入栈两个元素");
}
void TestminStackPop()
{
TITLE;
minStack stack;
minStackInit(&stack);
minStackPush(&stack,'a');
minStackPush(&stack,'c');
minStackPush(&stack,'d');
minStackPrint(&stack,"入栈三个元素");
minStackPop(&stack);
minStackPrint(&stack,"出栈一个元素");
}
void TestminStackGet()
{
TITLE;
minStack stack;
minStackType value;
minStackInit(&stack);
minStackPush(&stack,'a');
minStackPush(&stack,'c');
minStackPush(&stack,'d');
minStackPrint(&stack,"入栈三个元素");
int ret = minStackGet(&stack,&value);
printf("[取栈最小值]\n");
printf("expect is 1,actul is %d\n",ret);
printf("expect is a,actul is %c\n",value);
}
int main()
{
TestminStackPush();
TestminStackPop();
TestminStackGet();
return;
}
#pragma once
#include<stdio.h>
#include<stdlib.h>
#define TITLE printf("\n=====================%s======================\n",__FUNCTION__);
typedef char minStackType;
typedef struct minStack
{
minStackType* data;
int size;
int capacity;
}minStack;
void minStackInit(minStack* stack); //初始化
void minStackDestroy(minStack* stack); // 销毁
void minStackPrint(minStack* stack,char* msg); //打印栈
void minStackPush(minStack* stack,minStackType value);//入栈
void minStackPop(minStack* stack);//出栈
int minStackGet(minStack* stack,minStackType* value);//取栈顶元素,失败返回0,成功返回1
运行结果演示:
如图可见栈顶元素始终未最小值 a 。