这个程序会有什么问题?怎么解决?

lustboy 发布于 2018/03/29 09:56
阅读 361
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

以下有个面试题,改程序设计上有什么问题?给出解决方案!

public class Stack {
    
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_SIZE = 16;

    public Stack() {
        elements = new Object[DEFAULT_SIZE];
    }
    
    public void push(Object e){
        refreshElements();
        elements[size++] = e;
    }

    private void refreshElements() {
        if(size >= elements.length){
            elements = Arrays.copyOf(elements, elements.length*2+1);
        }
    }
    
    public Object pop() throws Exception{
        if(size==0){
            throw new Exception();
        }
        return elements[--size];
    }
    
}

加载中
0
tcxu
tcxu

本程序想到了 push  场合,数组 elements 的容量(elements.length)不够时,增加容量。 可是,为了时刻节约资源,还要考虑 pop 场合,当数组下标 size 降到 elements 容量的一半以下的时候,应当实行将elements 容量(elements.lenmgth)减半的操作。为此, 添加一个 reduceElements()方法。这样每逢 pop之前,先调用 reduceElements() 方法,以时刻监视 size 的现状,若低于当前容量的一半,应当将容量减半。

改动如下:

	private void refreshElements() {
        if(size == elements.length){
            elements = Arrays.copyOf(elements, elements.length*2+1);
        }
    }
    
  	private void reduceElements(){
  		if (size< elements.length/2)
  			elements = Arrays.copyOf(elements, elements.length/2 + 1);
  	}
    
    public Object pop() throws Exception{
    	reduceElements();
        if(size==0){
            throw new Exception();
        }
        return elements[--size];
    }

 

0
风青山
风青山
这个看需求场景的吧,平时50就够用,突发情况1000也不够用,就容易出现扩容,最后容量又没法减小。 特别是扩容是几何增长的,翻几次后,可能容量很大,但最多只用到55%。 看看Java最近几个版本的ArrayList等几何的具体实现,扩容都是加1扩容。
0
临风ivy
临风ivy

既然是入栈出栈,为何不用链表结构?

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部