第二题 设计包含min 函数的栈。

本文介绍了一种使用辅助栈实现具有最小元素获取功能的主栈的方法,详细阐述了压栈、弹栈和获取最小元素的操作,确保所有操作的时间复杂度均为O(1)。

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

定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。

要求函数min、push 以及pop 的时间复杂度都是O(1)。

思想:用一个栈来存储最小的元素,主要是压栈函数的写法,1)压栈时先判断栈是否为满了或是空的,然后再判断当前压入的元素是否比前一个元素大,大的话交换位置;2)直接得到栈顶元素的引用,对栈顶元素进行赋值,主要最小值的取法。

#include<iostream>
using namespace std;
struct MinStackElement
{
	int data;
	int min;
};
struct MinStack
{
	MinStackElement *data;
	int size;
	int top;
};
MinStack MinStackInit(int maxSize)
{
	MinStack stack;
	stack.size = maxSize;
	stack.data = (MinStackElement*) malloc(sizeof(MinStackElement)*maxSize);
	stack.top = -1;
	return stack;
}
void MinStackFree(MinStack stack) 
{
	free(stack.data);
}

//压栈时先判断栈是否为满了或是空的,然后再判断当前压入的元素是否比前一个元素大,大的话交换位置
void MinStackPush(MinStack *stack, int d)  
{
	if (stack->top == stack->size-1) cout<<"out of stack space.";
	MinStackElement *tmp=(MinStackElement*) malloc(sizeof(MinStackElement));
	if(tmp==NULL)
		return;
	tmp->data=tmp->min=d;

	if(stack->top==-1)
	{
		stack->top++;
		stack->data[stack->top]=*tmp;
	}
	else
	{
		MinStackElement p = stack->data[stack->top];
		if (p.min < d) 
		{
			stack->top++;
			stack->data[stack->top]=p;
			stack->data[stack->top-1]=*tmp;
		}
		else
		{
			stack->top++;
			stack->data[stack->top]=*tmp;
		}
	}
}
int MinStackPop(MinStack *stack)
{
	int tmp;
	if (stack->top == -1) cout<<"stack is empty!";
	tmp=stack->data[stack->top].data;
	stack->top--;
	return tmp;
}
int MinStackMin(MinStack stack)
{
	if (stack.top == -1) cout<<" stack is empty!\n";
	return stack.data[stack.top].min;
}
int main()
{
	int data;
	MinStack test=MinStackInit(10);
	for(int i=0;i<5;i++)
	{
		cin>>data;
		MinStackPush(&test,data);
	}
//  输出栈中元素
	/*
	for(int j=0;j<5;j++)
	{
		cout<<MinStackPop(&test)<<endl;
	}
	*/
//	输出最小的元素
	cout<<MinStackMin(test)<<endl;
	return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值