每日编程20之用一个数组实现2个和3个栈
2013-03-14 20:05
423 查看
用一个数组实现2个栈很简单,只要一个栈栈底在数组左边,向右生长,另一个栈栈底在数组右边,向左生长。判断栈满的条件是二个栈元素之和超过数组大小。
实现3个栈似乎有难度。。。
直观的想法是,将数组静态的分为3个区域以实施3个栈,这样的话,存储空间的使用会非常的不灵活。
对这个想法的一个优化是,3个栈的栈底分别是数组的start,mid,end 。。mid这个栈的push,pop操作交替左右执行,以保证start,end栈空间大小的公平性。。
这种想法使得,start,end是绝对公平的,但每个栈的最大元素个数也不能超过数组元素的一半,即使另一个栈可能是空的。
另一种较为巧妙的方法是,3个栈每个栈的栈底分别是数组的第0,1,2三个元素,数组的push,pop都是指针+3操作。。。这就是所谓的交叉索引算法。。
这个算法导致,3个栈能使用的空间是公平的,都不能超过数组元素的1/3。。
貌似还有静态链表方案,不置可否,
实现3个栈似乎有难度。。。
直观的想法是,将数组静态的分为3个区域以实施3个栈,这样的话,存储空间的使用会非常的不灵活。
对这个想法的一个优化是,3个栈的栈底分别是数组的start,mid,end 。。mid这个栈的push,pop操作交替左右执行,以保证start,end栈空间大小的公平性。。
这种想法使得,start,end是绝对公平的,但每个栈的最大元素个数也不能超过数组元素的一半,即使另一个栈可能是空的。
另一种较为巧妙的方法是,3个栈每个栈的栈底分别是数组的第0,1,2三个元素,数组的push,pop都是指针+3操作。。。这就是所谓的交叉索引算法。。
这个算法导致,3个栈能使用的空间是公平的,都不能超过数组元素的1/3。。
貌似还有静态链表方案,不置可否,
相关文章推荐
- 求数组中的最大值--分别用非类,类,带一个参数的类模板,带2个参数的类模版实现
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- cc150:使用一个数组实现3个栈
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- C语言- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现。
- 编程实现一个栈结构,用数组来实现,具有入栈、出栈操作。
- 1.求第n个斐波那契数(非递归实现)。 2.一个数组中只有两个数字是出现一次,其他所有数字都出现 了两次。 找出这两个数字,编程实现。
- 求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4](需写明思路,并编程实现)
- 每日一题16:在一个数组中实现两个栈
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大 java实现
- 编程珠玑: 14章 堆 14.2实现一个优先级队列,返回数组中最小值 -------解题总结
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现
- 每日一练--一个数组实现三个栈
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现。
- 【Java每日编程题01】实现一个方法,接收一个层数值n,打印一个有n层的直角三角形,并返回底边最后一个值。并打印出来。
- 编程产生一个int数组,长度为30,并向其中随机插入1-30,并且不能重复输出数组。实现一个冒泡排序算法对其进行排序,输出排序结果
- 面试题,求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4](需写明思路,并编程实现)
- 使用1个标签,2个标签,3个标签,5个标签实现一个十字架
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 编程:用java 语言实现,输入一个数,就相应地输出的几维数组!||用1、2、2、3、4、5这六个数字,用java写一个函数,打印出所有不同的排列,要求:"4"不能在第三位,"3"与"5"不能相连