使用数组拷贝实现自定义栈数据结构
通过数组拷贝实现自定义栈,以固定大小数组存储元素,利用System.arraycopy或Arrays.copyOf创建新数组模拟动态扩容与缩容。入栈满时容量翻倍;出栈后元素数降至容量四分之一且大于默认值时缩容减半。拷贝范围需精确,原数组长度不可直接修改。
用数组拷贝实现自定义栈,核心思路其实很简单:就是用固定大小的数组来存元素,每次入栈或出栈时,通过System.arraycopy或Arrays.copyOf创建一个新数组,模拟出动态扩容和缩容的效果。这么做,绕开了ArrayList或Stack这些现成工具,帮我们更清楚地理解底层在干什么。

栈的基本结构与初始化
先定义个泛型类ArrayStack,里面维护两个核心成员:一个是对象数组elements,另一个是栈顶索引size——它指向下一个元素要放的位置。初始容量设个默认值就行,比如4,数组在构造时创建好。
size = 0代表栈空,size == elements.length就是栈满。- 注意一点:所有“改变容量”的操作,都不直接修改原数组的长度——而是通过拷贝生成一个新数组来替换。
push 操作:扩容拷贝
入栈前先检查有没有满。如果满了,就创建一个容量翻倍的新数组,把原数组里的所有元素拷贝过去,然后再把新元素塞进去。
- 最简洁的方式是用
Arrays.copyOf(elements, elements.length * 2); - 如果你想亲手抠细节,等价写法是:
Object[] newArr = new Object[oldLen * 2]; System.arraycopy(oldArr, 0, newArr, 0, oldLen);。 - 拷贝完成后,更新
elements引用,再把新元素放到elements[size++]的位置。
pop 操作:缩容拷贝(可选但推荐)
出栈后,如果元素数量降到了容量的四分之一,而且当前容量还大于默认值,就可以考虑缩容了——这样做能省点内存。
- 触发条件:
size > 0 && size == elements.length / 4 && elements.length > DEFAULT_CAPACITY。 - 新建一个长度减半的数组,用
Arrays.copyOf(elements, elements.length / 2)拷贝前size个有效元素。 - 这里的要点是:拷贝的是有效元素个数(
size),而不是整个旧数组。
其他细节与注意事项
peek、isEmpty、size这些方法都直接访问elements和size就行,不需要拷贝。需要特别留意的有这么几点:
- 所有改变数组长度的操作,都必须通过拷贝实现,原数组绝不能直接变长或变短。
- 拷贝的范围要精确:push时拷全部;pop缩容时只拷
size个有效元素。 - 创建泛型数组时,需要绕过类型擦除:用
(E[]) new Object[capacity],再加个@SuppressWarnings("unchecked")压制警告。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















