#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) //將當前元素和入棧前的最小元素進行比較,如果比之前的的小,就把當前入棧的元素設為自己的datap->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;}