#include<stdio.h>
#include<malloc.h>
#include<assert.h>
struct StcakElement
{
int data; //插入的元素的数值
int min; //存放当前栈中最小元素
};
struct Stack
{
StcakElement * pStackElement; //指向栈原始的指针,结合top就能操作栈顶元素
int size; //存放栈的容量
int top; //存放下一个可用的栈的位置
};
void StackInit(Stack* & pstack, int maxsize ) //栈的初始化
{
assert(pstack);
pstack->size = maxsize;
pstack->top = 0;
pstack->pStackElement =(StcakElement * )malloc(sizeof(StcakElement)*maxsize);
}
void StackFree (Stack stack) //将栈销毁,释放申请的空间,减size设为0;
{
free(stack.pStackElement);
stack.size = 0;
stack.top = 0;
}
void StackPush(Stack & stack, int data) //入栈操作,把里面的一些元素初始化
{
if(stack.top == stack.size)
printf("out of stack space");
StcakElement * p = stack.pStackElement+stack.top;//也可以不用这样的一个指针变量P,这样写是因为后面的实在有点长
p->data = data;
if(stack.top == 0)
{
p->min =data;
}
else
{
p->min = (stack.pStackElement[stack.top-1]).min;//如果top不为0,则当前入栈的元素的min存放的是上一个栈顶元素中的最小值;
}
if(p-> min >data) //将当前元素和入栈前的最小元素进行比较,如果比之前的的小,就把当前入栈的元素设为自己的data
p->min = data;
(stack.top)++;
}
void StackPop(Stack &stack)//出栈操作
{
if(stack.top == 0)
printf("stack is empty");
stack.pStackElement[--stack.top]; //将指示栈顶原始的值减1
}
int StackMin(Stack stack) //找到当前栈顶元素里存放的当前栈的最小值
{
if(stack.top == 0)
printf("stack is empty");
return stack.pStackElement[stack.top-1].min;
}
int main( )
{
Stack stack; //初始化
Stack * pa = & stack ;
StackInit( pa,5);
StackPush(*pa, 0);
StackPush(*pa, 5);
StackPush(*pa, 3);
StackPush(*pa,1);
StackPop(*pa);
int min = StackMin(*pa);
printf("栈中当前最小的元素为:%d\n", min);
return 0;
}