C语言数组实现栈的基本操作,并利用O(1)求出栈中最小元素

本文介绍了一种特殊的栈实现方法,该方法不仅能够进行基本的栈操作,还能高效地追踪栈内元素的最小值。通过定义一个额外的数组来记录从栈底到每个元素的最小值,实现了在常数时间内获取当前栈内的最小元素。

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#define MAX_STACK_SIZE 80

typedef struct
{
	unsigned int stack[MAX_STACK_SIZE];
	int top; //top 默认值是-1,所以应该是int型
	unsigned int down_min[MAX_STACK_SIZE]; //储存栈中各个元素到栈底元素中的最小值,eg 栈[5,2,3,4,8,1] 5为栈底,则down_min为[5,2,2,2,2,1]
}sequence_stack;
/*初始化栈*/
sequence_stack* initialize_seqstack() 
{
	sequence_stack* seqstack = NULL;
	seqstack = (sequence_stack*)malloc(sizeof(sequence_stack));
	memset(seqstack,0,sizeof(sequence_stack));
	seqstack->top = -1;
	return seqstack;
}
/*销毁栈*/
void destroy_seqstack(sequence_stack* seqstack)
{
	if(seqstack != NULL)
	{
		free(seqstack);
	}
	return;
}
/*入栈*/
unsigned int push_seqstack(sequence_stack *seqstack, unsigned int value)
{
	if(seqstack != NULL)
	{
		if(seqstack->top == MAX_STACK_SIZE-1)
		{
			printf("stack is full\n");
			return -1;
		}
		else
		{	seqstack->stack[++seqstack->top] = value;
			if(seqstack->top == 0)
			{
				seqstack->down_min[seqstack->top] = value;
			}
			else
			{	if(value < seqstack->down_min[seqstack->top-1])
				{
					seqstack->down_min[seqstack->top] = value;
				}
				else
				{
					seqstack->down_min[seqstack->top] = seqstack->down_min[seqstack->top-1];
				}
			}
			return 0;
		}
	}
	return -1;
}
/*出栈*/
unsigned int pop_seqstack(sequence_stack *seqstack)
{
	if(seqstack != NULL)
	{
		if(seqstack->top == -1)
		{
			printf("stack is empty\n");
			return -1;
		}
		else
		{
			return seqstack->stack[seqstack->top--];
		}
	}
}
/*打印栈元素*/
void print_seqstack(sequence_stack *seqstack)
{
	if(seqstack != NULL)
	{
		int i = 0; 
		printf("stack from end to top :\n");
		for(i=0;i<=(seqstack->top);i++)
		{
			printf("%d,",seqstack->stack[i]);
		}
		printf("\n");
	}
}
/*打印最小数组元素*/
void print_seqstack_min_array(sequence_stack *seqstack)
{
	if(seqstack != NULL)
	{
		int i = 0;
		printf("down_min from end to top :\n");
		for(i=0;i<=(seqstack->top);i++)
		{
			printf("%d,",seqstack->down_min[i]);
		}
		printf("\n");
	}
}
/*打印当前栈的最小值*/
void printf_minvalue(sequence_stack *seqstack)
{
	if(seqstack != NULL)
	{
		printf("min value is %d\n",seqstack->down_min[seqstack->top]);
	}
	return ;
}
void main()
{    
	sequence_stack *seqstack = initialize_seqstack();
	push_seqstack(seqstack,5);
	push_seqstack(seqstack,13);
	push_seqstack(seqstack,6);
	pop_seqstack(seqstack);
	pop_seqstack(seqstack);
	pop_seqstack(seqstack);
	push_seqstack(seqstack,2);
	push_seqstack(seqstack,33);
	push_seqstack(seqstack,7);
	print_seqstack(seqstack);
	print_seqstack_min_array(seqstack);
        destroy_seqstack(seqstack);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值