天天看點

H面試(22):設計一個棧,能輸出目前棧中最小元素

#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;
}