有限堆栈实现

时间:2014-10-06 22:32:05

标签: java arrays stack

我是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个构造函数吗?一个参数和一个没有?我知道构造函数并不难编码......但有些东西已经过去了。我的想法是通过实例化大小和数组......

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

3 个答案:

答案 0 :(得分:3)

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

顺便说一句,LinkedBlockingDeque将是使用标准JDK类实现它的方法。

此外,您可能希望更改术语。通常 capacity 将是堆栈可容纳的最大元素数量的单词, size 将是当前堆栈中元素的数量。

答案 1 :(得分:1)

是的,你需要两个构造函数。一个没有参数的构造函数,一个带有参数的构造函数:

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;
}

附注:您无需说java.lang.Object即可使用Object。同样按照惯例,您不应该使用大写字母启动变量名称。

答案 2 :(得分:1)

  

我必须使用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。

  • 还可能有第三个" size",表示当前已分配到有界堆栈的空间量。但是,这应该是内部的;即没有通过吸气剂暴露。

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

你应该在你的API和内部细节中谨慎区分这两个"尺寸" ......或者你会混淆使用API​​的人,最终是你自己。