H面试(22):设计一个栈,能输出当前栈中最小元素

本文介绍了一种特殊的栈实现方法,该栈能够在常数时间内完成压栈、弹栈及获取栈内最小值的操作。通过自定义结构体来记录每个元素及其对应的栈内最小值,从而高效地支持这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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


 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值