设计一个栈,支持push、pop、top等操作。并且能够在O(1)的时间内检索到最小元素,即设计一个“最小栈”。
思路:用两个栈实现。一个普通栈,一个min栈(普通栈负责数据的入、出,min栈的栈顶永远保存当前元素的最小值)。第一次入栈时,入到普通栈、min栈中。再次入往普通栈入数据时,当该数据<=min栈栈顶元素时,也将该数据入到min栈中,否则只入到普通栈中。从普通栈出数据时,该数据==min栈栈顶数据时,min栈也弹出栈顶元素,否则只弹出普通栈顶元素。总体思想就是min栈用于保存当前数据元素的最小值。
注意:在C语言中,当我们自己实现了栈后,直接定义两个这样的对象使用,也可以自己现场设计一个MinStack栈,里面包含两个类似栈的东西,以下就是这样做的。当前在C++中可以直接调用库中的栈,创建两个栈对象。
typedef struct//我们自己定义的“最小栈”
{
//普通栈
int* pst;
int stTop;
//最小栈
int* pminst;
int minstTop;
}MinStack;
void minStackCreate(MinStack* pm, int maxSize) //初始化
{
//pm = (MinStack*)malloc(sizeof(MinStack));//这就话加上之后pm就不指向m了,非常坑!
pm->pst = (int*)malloc(sizeof(int)*maxSize);
pm->stTop = 0;
pm->pminst = (int*)malloc(sizeof(int)*maxSize);
pm->minstTop = 0;
}
void minStackPush(MinStack* pm, int x)//入栈
{
assert(pm);
/*int pst = pm->pst;
int pminst = pm->pminst;
pm->pst[pm->stTop++] = x;
if (pm->minstTop == 0 || x <= pminst[pm->minstTop - 1])
{
pminst[pm->minstTop++] = x;
}*/
if (pm->minstTop == 0 || x <= pm->pminst[pm->minstTop - 1])
{
pm->pminst[pm->minstTop++] = x;
}
//无论如何,普通栈是要入的
pm->pst[pm->stTop++] = x;
}
void minStackPop(MinStack* pm)//出栈
{
if (pm->pst[pm->stTop - 1] == pm->pminst[pm->minstTop - 1])
{
pm->minstTop--;
}
//无论如何,普通栈是要出的
pm->stTop--;
}
int minStackTop(MinStack* pm)//取栈顶元素
{
return pm->pst[pm->stTop - 1];
}
int minStackMin(MinStack* pm)//取最小元素
{
return pm->pminst[pm->minstTop - 1];
}
void minStackFree(MinStack* pm)
{
free(pm->pst);
free(pm->pminst);
free(pm);
}