编程之美系列之栈和队列1—在O(1)的时间内得到栈的最大或者最小值
2013-04-30 14:14
197 查看
1、定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。对于找最大值其实是一个道理,这里就不废话了。
要求:函数min、push、pop的时间复杂度都是o(1)
这里用一个辅助栈去动态的维护栈的最小值,每次如果有新元素加进来,就和辅助栈的栈顶元素比较,如果新元素较小,把新元素push到辅助栈里面,如果新元素较大,将栈顶的元素拷贝到top+1里面。所以pop的时候直接--top就可以了,而取最小值的时候取MinStack[top]就OK了。太简单了,没写成函数。
OK,其实这不是我想说的重点,因为这个太简单了。那我要说的重点是什么呢?如果说需要在O(1)的时间内取得队列的最大或者最小值呢?(哎呀,最大值一样的撒)那怎么破????好,等我写好代码之后再来补充吧!
OK,重点来了,详情请猛击博客:http://blog.csdn.net/kay_zhyu/article/details/8869641
要求:函数min、push、pop的时间复杂度都是o(1)
这里用一个辅助栈去动态的维护栈的最小值,每次如果有新元素加进来,就和辅助栈的栈顶元素比较,如果新元素较小,把新元素push到辅助栈里面,如果新元素较大,将栈顶的元素拷贝到top+1里面。所以pop的时候直接--top就可以了,而取最小值的时候取MinStack[top]就OK了。太简单了,没写成函数。
#include<stdio.h> const int N = 30; int stack1 ; int top1; int MinStack ; 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
相关文章推荐
- 编程之美系列之栈和队列2—在O(1)的时间内得到队列的最大或者最小值
- 元素函数编程之美系列之栈和队列1—在O(1)的时间内得到栈的最大或者最小值
- layui设置日期最大值或者最小值为当前时间
- mysql group by分组,根据一个字段分组 ,又想得到另一个字段的最大或者最小。如何解决。
- 栈和队列(8)-- 最大值减去最小值小于或者等于num的子数组
- 使用R语言得到向量中所有的最大值或者最小值的下标
- SQL 多列取最大或者最小值
- 如何实现具有最大值、最小值和中间值的栈和队列
- HDU 6000 Wash【优先队列优化贪心】【最大值+最小值】
- 最大值减去最小值小于或者等于num的子数组数量
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)
- 前面所有input时间的最大时间<时间<后边所有Input时间的最小时间
- JAVA得到数组中最大值和最小值的简单实例
- 最小货架剩余寿命\总货架寿命\最大仓储时间
- 使用优先级队列求一个大数组中的前k个最大的数(或前k个最小的数)
- 最大值减去最小值小于或者等于num的子数组数量
- 找出一堆数据中最大或者最小的K个数
- 无序序列中O(n)时间复杂度寻找最小(最大)的K个数
- iOS 得到当前时间 之前 或者 之后 N天的日期
- SQL SERVER多列取最大或者最小值