2013-03-12 65 views
0

我对数据结构&算法,和的任务之一就是动态分配空间

“提示字符堆栈的大小的用户编程作业(M )在运行时,动态地为系统中的堆栈中的用户栈分配空间。您明确可以不使用“新,malloc的,”或任何其它操作者,这在任何语言分配在堆空间。

我是新人到数据结构,并想知道下面的代码是否符合要求?

代码:

public class DynamicStack 
{ 
    private char[] array; 
    private int  top = 0; // Array counter 
    private int  size;  // Array size 

    private final double CAPACITY_CHANGE_RATE = 1.3; // Stack resize ratio 

    .... 
    All other methods: push(), pop(), peek(), and etc. 
    .... 

    private void ensureCapacity() 
    { 
     if (isFull()) { 
      size = (int) Math.ceil(size * CAPACITY_CHANGE_RATE); 
      char[] oldArray = array; 
      array = new char[size]; 
      System.arraycopy(oldArray, 0, array, 0, oldArray.length); 
     } 
    } 
} 

从技术上讲,无论我非静态方法中使用已在新系统堆栈进行分配,并在堆不走,对不对?

+0

由于您在array = new char [size];中使用'new'运算符,因此您的代码不符合要求。 – Jesper 2013-03-12 13:07:24

回答

4

从技术上讲,无论我在非静态方法内使用什么,都必须在新的系统堆栈中分配,而不是堆在堆中,对吧?

如果你问,如果一切在栈中分配,那么答案(在Java中)是:不 - 这是不正确的。例如array = new char[size]从堆分配char数组。在Java new总是从堆分配。

事实上,我不认为你可以用Java写这个程序......给出这些约束。尝试C或C++。

+0

该作业特别提到“您可以使用C++,Ada,Perl,Java,PHP和Cobol。”我想教授犯了一个错误? – 2013-03-12 13:06:29

+1

最初是我的回答,但更好的是作为您的回答[Java语言规范](http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf)的评论§17.4.1说: “所有实例字段,静态字段和数组元素都存储在堆内存中” – Charlie 2013-03-12 13:06:42

+1

@LinarGarifullin - 我认为这值得与教授一起澄清。也许他*想要说*单个堆栈单元不能在堆上分配。但是,就表面看来,这看起来像一个错误。 (这当然是一种相当“有趣”的语言混合......) – 2013-03-12 13:44:14