如何调整数组大小

如何调整数组大小

​ 选择用数组表示栈内容意味着用例必须预先估计栈的最大容量。在Java中,数组一旦创建,其大小是无法改变的,因此栈使用的空间只能是这个最大容量的一部分。选择大容量的用例在栈为空或几乎为空时会浪费大量的内存。例如,个交易系统可能会涉及数十亿笔交易 和数千个交易的集合。即使这种系统般都会限制每笔文易只能出现在一个集合中, 但用例必须保证所有集合都有能力保存所有的交易。另一方面,如果集合变得比数组更大那么用例有可能溢出。为此,push() 方法需要在代码中检测栈是否已满,我们的API中也应该含有一个isFull() 方法来允许用例检测栈是否已满。我们在此省略了它的实现代码,因为我们希望用例从处理栈已满的问题中解脱出来,如我们的原始Stack API所示。因此,我们修改了数组的实现,动态调整数组a[] 的大小,使得它既足以保存所有元素,又不至于浪费过多的空间。实际上,完成这些目标非常简单。首先,实现一个方法将栈移动到另一个大小不同的数组中:

private void resize(int max) {
    //将大小为N < = max 的栈移动到一个新的大小为 max的数组中
    Item[] temp = (Item[]) new Object[max];
    for (int i = 0; i < )
        temp[i] = a[i];
    a = temp;
}

​ 现在,在push() 中,检查数组是否太小。具体来说,我们会通过检查栈大小N和数组大小a. length是否相等来检查数组是否能够容纳新的元素。如果没有多余的空间,我们会将数组的长度加倍。然后就可以和从前一样用a[N++] = item 插入新元素了:

pulic void push(Item item) {
    //将元素压入栈顶
    if (N == a.length) resize(2*a.length);
    a[N++] = item;
}

​ 类似,在pop() 中,首先删除栈顶的元索,然后如果数组太大我们就将它的长度减半。只要稍加思考,你就明白正确的检测条件是栈大小是否小于数组的四分之一。在数组长度被减半之后,它的状态约为半满,在下次需要改变数组大小之前仍然能够进行多次push() 和pop() 操作。

public Item pop() {
    //从栈顶删除元素
    Item item = a[--N];
    a[N] = null;	//避免对象游离
    if (N > 0 && N == a.length/4) resize(a.length/2);
    return item;
}

​ 在这个实现中,栈永远不会溢出,使用率也永远不会低于四分之一(除非栈为空,那种情况下数组的大小为1

码子不易, 点个赞呗 ♡♡♡
关注『 Mr阿布 』微信公众号
有问题欢迎大家交流 ☟ ☟ ☟

img

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值