实现一个最小栈

设计一个栈,支持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);
}
 
 
 

你可能感兴趣的:(数据结构)