2013-03-12 62 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