首页 新闻 会员 周边

栈的扩容问题

0
悬赏园豆:50 [待解决问题]

背景:我现在用java数组实现一个栈,在入栈的时候需要判断是否栈满,如果栈满,就需要对栈进行扩容。

我的想法:申请一个更大的数组,然后将之前数组里面的内容依次遍历复制进去。

我的问题:想问各位大佬还有什么办法能解决这个问题吗

长安不乱的主页 长安不乱 | 初学一级 | 园豆:152
提问于:2020-10-15 09:06
< >
分享
所有回答(6)
0

不如你直接看ArrayList的源码

yytxdy | 园豆:1680 (小虾三级) | 2020-10-15 09:10

我看ArrayList对于扩容是直接进行了Arrays.copyOf复制,在扩容长度上讲究了一下

支持(0) 反对(0) 长安不乱 | 园豆:152 (初学一级) | 2020-10-15 09:24
0

Java应该也有将整个数组赋值到新的数组中的方法,可以找找

通信的搞程序 | 园豆:1747 (小虾三级) | 2020-10-15 09:11

你说的是,Arrays.copyOf这种直接赋值的方法吗

支持(0) 反对(0) 长安不乱 | 园豆:152 (初学一级) | 2020-10-15 09:25
0

我觉得可以,不过扩容的时候最好别一个一个扩,一次扩容多加一些预留位置,可以减少扩容次数

会长 | 园豆:12401 (专家六级) | 2020-10-15 09:20

是不是每次扩容的容量大点?我设置新数组是原数组的俩倍,应该还行吧

支持(0) 反对(0) 长安不乱 | 园豆:152 (初学一级) | 2020-10-15 09:29

@长安不乱: 应该可以,另外如果出栈的元素太多了,可能还要考虑减小数组的长度呢

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-10-15 09:37

我觉得如果用列表实现,比数组简单,不用考虑扩容什么的,比如有一个链表a->b->c,如果push了一个d,就改成d->a->b->c,pop后再变成a->b->c这样是不是简单一点

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-10-15 09:39

@会长: 只要是被指定了,是我的一道面试题,指定就用数组来实现栈,当时就问的这个扩容问题。

支持(0) 反对(0) 长安不乱 | 园豆:152 (初学一级) | 2020-10-15 09:44

@会长: 这个减少数组的长度确实也可以加上

支持(0) 反对(0) 长安不乱 | 园豆:152 (初学一级) | 2020-10-15 09:45

@长安不乱: 我觉得可以这样,最开始设置一个初始长度,比如50或者100,快满的时候增加一倍,当元素数量减少到不到一半时,减半

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-10-15 09:49
0

我没记错的话,map就能实现自动扩容功能。可以看看map源码list好像也能自动扩容。扩容的操作方式就是先判断,然后复制。

无名氏法师 | 园豆:204 (菜鸟二级) | 2020-10-15 09:24

嗯嗯。我看ArrayList里面的源码也是这样操作的

支持(0) 反对(0) 长安不乱 | 园豆:152 (初学一级) | 2020-10-15 09:29
0

确定下自己的扩容因子,思路没问题。

文争青 | 园豆:259 (菜鸟二级) | 2020-10-15 14:42
0

你直接看SDK的stack实现最靠谱,

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Stack.java

http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/src/share/classes/java/util/Vector.java

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
czd890 | 园豆:14412 (专家六级) | 2020-10-19 18:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册