编程之美系列之栈和队列1—在O(1)的时间内得到栈的最大或者最小值

1、定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。对于找最大值其实是一个道理,这里就不废话了。
要求:函数min、push、pop的时间复杂度都是o(1)
这里用一个辅助栈去动态的维护栈的最小值,每次如果有新元素加进来,就和辅助栈的栈顶元素比较,如果新元素较小,把新元素push到辅助栈里面,如果新元素较大,将栈顶的元素拷贝到top+1里面。所以pop的时候直接--top就可以了,而取最小值的时候取MinStack[top]就OK了。太简单了,没写成函数。

#include<stdio.h>
const int N = 30;
int stack1[N];
int top1;
int MinStack[N];
inline int min(const int a, const int b)
{
	return a < b ? a : b;
}
//有元素入栈的时候,维护MinStack数组
void Add(int *stack, int *MinStack, int &top, int v)
{
	if(top > -1)
	{
		stack[++top] = v;
		MinStack[top] = min(MinStack[top - 1], v);
	}
	else
		stack[top] = MinStack[++top] = v;
}
int main()
{
	int n,IsPush,i,v;
	while(scanf("%d", &n) != EOF)
	{
		top1 = -1;
		for(i = 0; i < n; ++i)
		{
			printf("输入操作选项:\n0 删除栈顶元素 1 增加元素 其它 得到最小值:");
			scanf("%d", &IsPush);
			if(IsPush == 1)
			{
				printf("输入要添加的数:");
				scanf("%d", &v);
				Add(stack1, MinStack, top1, v);
			}
			else if(!IsPush)
			{
				--top1;
			}
			else
			{
				if(top1 > -1)
				{
					printf("栈中元素为:\n");
					for(int j = 0; j <= top1; ++j)
						printf("%d ", stack1[j]);
					printf("\n最小值为:%d\n", MinStack[top1]);
				}
				else
					printf("空栈\n");
			}
		}//end for
		printf("over\n");
	}//end while
}

OK,其实这不是我想说的重点,因为这个太简单了。那我要说的重点是什么呢?如果说需要在O(1)的时间内取得队列的最大或者最小值呢?(哎呀,最大值一样的撒)那怎么破????好,等我写好代码之后再来补充吧!
OK,重点来了,详情请猛击博客:http://blog.csdn.net/kay_zhyu/article/details/8869641

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值