【问题标题】:bounded stack implementation有界堆栈实现
【发布时间】:2014-12-01 06:48:08
【问题描述】:

我是 Java 新手。 我想创建一个有界堆栈,用户可以在构造函数中选择他想要在他的数组(堆栈)中有多少元素。我的堆栈是一个对象数组。 我创造了这样的东西:

public class BoundedStack {

    int Size;
    java.lang.Object[] List;

    public BoundedStack(int size) {

  this.Size = size;
}

如果我创建 BoundedStack 类的实例会很酷,类型对象的数组将在构造函数中使用 Paramater 的大小创建。 (int size)。

如果用户不想在构造函数中给出一个数字,而只是声明类BoundedStack 的一个实例。 List 数组的默认值应为 32 个元素。

这里有些东西不起作用。我必须使用 2 个构造函数吗?一个带参数,一个不带?我知道构造函数的编码并不难……但是通过实例化大小和数组,我的脑海中浮现出一些东西……

有谁知道我该如何解决这个问题?

【问题讨论】:

  • 如果您希望 size 参数是可选的,那么是的,您需要编写一个带参数的构造函数和一个不带参数的构造函数。你剩下的问题,我不明白。

标签: java arrays stack


【解决方案1】:

是的,两个构造函数。应该采取大小论点;另一个应该不带参数,并且应该使用 this(32); 来遵循另一个,以获得默认大小 32。

顺便说一句,LinkedBlockingDeque 将是使用标准 JDK 类实现此功能的方式。

另外,您可能想要更改术语。通常 capacity 是堆栈可以容纳的最大元素数,size 是当前堆栈上的元素数。

【讨论】:

    【解决方案2】:

    是的,您需要两个构造函数。一个没有参数的构造函数,一个有大小参数的构造函数:

    public BoundedStack() {
        // you could set the array directly
        list = new Object[32];
    
        // however, it's better to call the other constructor using the this() syntax
        this(32);
    }
    
    public BoundedStack(int size) {
        list = new Object[size];
    }
    

    您无需单独跟踪数组的大小。您可以简单地使用list.length 来查找数组的大小,换句话说:

    public int getSize() {
        return list.length;
    }
    

    Side cmets:你不需要说java.lang.Object,你可以简单地使用Object。同样按照惯例,变量名不应以大写字母开头。

    【讨论】:

    • 非常感谢!我还遇到了使用 size 对象创建该列表的问题。你现在通过展示一个例子帮助了我!和平兄弟
    • 您绝对应该采用第二个选项调用this(32) 而不是直接创建数组。目前看起来还不错,但是当您开始向构造函数中添加更多代码时,继续复制代码将变得无法维护。
    • 同意,只是尝试根据问题的级别调整答案,这就是我提到两者的原因。
    【解决方案3】:

    我必须使用 2 个构造函数吗?一个有参数,一个没有?

    您不必那样做,但这似乎是最自然的。例如:

        ...
    
        public static final int DEFAULT_BOUND = 32;
    
        private final Object[] elements;
        private int size;
    
        public BoundedStack() { this(DEFAULT_BOUND); }
    
        public BoundedStack(int bound) {
            // validate bound ...
            elements = new Object[bound];
            size = 0;
        }
    
        public int size() { return size; }
    
        public int getBound() { return elements.length; }
    

    另一件让你困惑的事情(我认为)是 有界 堆栈至少有两个“大小”:

    • 一个“大小”是堆栈中当前元素的数量。如果要与Collection 框架保持一致,那么该大小应称为size,并且应由具有非标准名称size() 的getter 返回。

    • 第二个“大小”是界限;即您将允许在堆栈中的最大元素数。我建议您将其称为 boundupperBound,并为它提供一个常规命名的 getter。

    • 可能还有第三个“大小”,表示当前分配给有界堆栈的空间量。但是,这可能应该是内部的;即不通过 getter 暴露。

    在集合框架中,术语“容量”用于初始“大小参数”。但是,具有“容量”参数的集合类型仅将其视为提示。您想要的是对堆栈大小的硬性限制,以及 (IMO) 保证使用不同的名称。

    您应该谨慎对待您的 API 和内部结构,以区分这两种“大小”……否则您会混淆使用 API 的人,最终混淆您自己。

    【讨论】:

    • 嗯,我明白你所说的“容量”,但我认为这是正确的术语。对于增长和缩小的集合,它用于在不进行内部调整大小操作的情况下存储多少;但是,对于固定大小的集合,无法调整大小。这里 capacity 仍然适用于相同的用法:它是在不需要(不可能的)调整大小操作的情况下适应多少。
    • @chiastic-security - 我有我的意见,你有你的。
    • 意见之美 :)
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 2013-01-25
    • 2010-11-27
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多