1>将最小值和当前元素封装成结构体<data, mindata>
MinStack.h
typedef int ElemType;
typedef struct Elem
{
ElemType _data;
ElemType _mindata;
}Elem;
void InitMinStack(MinStack* s);
void MinStackPush(MinStack* s, ElemType data);void MinStackPop(MinStack* s);ElemType TopMinStack(MinStack* s);int SizeMinStack(MinStack* s);ElemType MinStackMin(MinStack* s);
MinStack.c
void InitMinStack(MinStack* s)
{
assert(!StackEmpty(&(s->_s)));
InitStack(&(s->_s));
}
void MinStackPush(MinStack* s, ElemType data)
{
Elem elem;//当前要入栈的结构体
Elem top; //栈顶结构体
assert(s);
elem._data = data;
elem._mindata = data;
//栈中没有数据----空栈
if (StackEmpty(&(s->_s)))
{
PushStack(&(s->_s), elem);
}
else//栈中有数据
{
top = TopStack(&(s->_s));
if (top._mindata < elem._data) //栈顶的最小值大于要插入的最小值
{
elem._mindata = top._mindata;
}
PushStack(&(s->_s), elem);//入栈
}
}
void MinStackPop(MinStack* s)
{
assert(s);
if (StackEmpty(&(s->_s))) //栈为空
return;
PopStack(&(s->_s));
}
int MinStackEmpty(MinStack* s)
{
assert(s);
return StackEmpty(&s->_s);
}
ElemType TopMinStack(MinStack* s)
{
assert(!MinStackEmpty(s));
return TopStack(&(s->_s))._data;
}
int SizeMinStack(MinStack* s)
{
assert(s);
return SizeStack(&(s->_s));
}
ElemType MinStackMin(MinStack* s)
{
assert(s);
return TopStack(&(s->_s))._mindata;
}
void TestMinStack()
{
MinStack ms;
InitMinStack(&ms);
MinStackPush(&ms, 2);
MinStackPush(&ms, 5);
MinStackPush(&ms, 4);
MinStackPush(&ms, 3);
MinStackPush(&ms, 1);
printf("size = %d\n", SizeMinStack(&ms));
printf("min = %d\n", MinStackMin(&ms));
printf("top = %d\n", TopMinStack(&ms));
MinStackPop(&ms);
printf("size = %d\n", SizeMinStack(&ms));
printf("min = %d\n", MinStackMin(&ms));
printf("top = %d\n", TopMinStack(&ms));
}
2>两个栈、一个存所有元素、一个存最小元素
MinStack.h
typedef SDataType MSDateType;
typedef struct MinStack
{
Stack _data; //当前元素的栈
Stack _mindata; //最小值的栈
}MinStack;
void InitMinStack(MinStack* s);
int MinStackEmpty(MinStack* s);
void PushMinStack(MinStack* s, MSDateType data);
void PopMinStack(MinStack* s);
MSDateType MinStackTop(MinStack* s);
MSDateType MinStackMin(MinStack* s);
int SizeMinStack(MinStack* s);
MinStack.c
void InitMinStack(MinStack* s)
{
assert(s);
InitStack(&s->_data);
InitStack(&s->_mindata);
}
int MinStackEmpty(MinStack* s)
{
return StackEmpty(&s->_data);
}
void PushMinStack(MinStack* s, MSDateType data)
{
assert(s);
if (MinStackEmpty(s) || data < TopStack(&s->_mindata))
//栈为空或者当前的值小于最小栈顶的值,当前元素入最小栈
{
PushStack(&s->_mindata,data);
}
PushStack(&s->_data, data);//入数据栈
}
void PopMinStack(MinStack* s)
{
if (MinStackEmpty(s))
{
return;
}
if (TopStack(&s->_data) == TopStack(&s->_mindata))
{
PopStack(&s->_mindata);
}
PopStack(&s->_data);
}
MSDateType MinStackTop(MinStack* s)
{
return TopStack(&s->_data);
}
MSDateType MinStackMin(MinStack* s)
{
return TopStack(&s->_mindata);
}
int SizeMinStack(MinStack* s)
{
return SizeStack(&s->_data);
}
void TestMinStack2()
{
MinStack ms;
InitMinStack(&ms);
PushMinStack(&ms, 2);
PushMinStack(&ms, 3);
PushMinStack(&ms, 4);
PushMinStack(&ms, 1);
PushMinStack(&ms, 5);
printf("size = %d\n", SizeMinStack(&ms));
printf("min = %d\n", MinStackMin(&ms));
printf("top = %d\n", MinStackTop(&ms));
PopMinStack(&ms);
printf("size = %d\n", SizeMinStack(&ms));
printf("min = %d\n", MinStackMin(&ms));
printf("top = %d\n", MinStackTop(&ms));
}