2011-06-29 61 views
0

我試圖打印鏈接列表實現的堆棧元素。在java中使用靜態變量

但是按照堆棧本身的順序打印,我需要一個java中的靜態變量。

public void display() 
{ 
<STATIC> <here I need> LinkedListImp temp = this; 

    while(temp.next!=null) 
    { 
    temp=temp.next; 
    display(); 
    } 

    System.out.println("\n\t"+ temp.element +"\n");; 
} 

雖然聲明像這樣,我得到一個錯誤。

我已經在接口概念中實現了display()。因此我不能顯示(LinkedListImp temp)。

interface StackMethods 
{ 
    int pop(); 
    void push(int numberint); 
    void display(); 
} 

例如, 如果堆棧的元素爲1,則2然後3. 我沒有想的輸出作爲1 2 3或1(換行)2(換行)3.
而是我想如3(新行) 2(行) 1(儘管它並不需要表現出真正的堆棧)

是否有實現這個任何其他方式?

+0

爲什麼你認爲你需要一個靜態局部變量,你期望它實現什麼? –

+0

我認爲一本關於基本語言細節的書會有所幫助。 – fyr

+0

爲什麼你需要一個方法內的靜態變量?在Java中靜態的含義與C++中的靜態不同。 – justkt

回答

1

如果您希望temp的值不依賴於display()的父類(LinkedListImp?)的實例,那麼您需要一個靜態類變量。在Java中,static關鍵字標記屬於整個類的變量,而不是單個實例。 Java中的Static創建一個變量,該變量也被稱爲「類變量」。根據定義,類變量不能是本地的。要了解有關靜態變量的更多信息,請參閱documentation必須說明或檢出this StackOverflow question that has the spec in an answer

但它看起來像你正在嘗試做的是使用一個類的實例,這意味着你不要想要一個靜態變量。你絕對需要與班級相關的價值。

但是,爲了使它工作,需要在while循環中的兩個語句中使用大括號。否則,你會得到一個循環遍歷鏈表的所有元素並打印出最後一個的程序。這是因爲在Java中,如果塊語句(if,else,for,while等)後面沒有大括號,它只會將下一行視爲塊的內容。

​​

要使用循環在這裏顛倒順序我會使用一個StringBuilder並建立一個字符串。

public void display() 
{ 
    LinkedListImp temp = this; 
    StringBuilder result = new StringBuilder(); 
    while(temp.next!=null) 
    { 
     result.insert(0, "\n\t"+ temp.element +"\n"); // put the result at the front 
     temp=temp.next; 
    } 
    System.out.println(result.toString()); 
} 

根據您的編輯,您已經爲方法添加了遞歸調用,但這不是循環所必需的。如果您正在進行遞歸,請刪除循環。在這種情況下,遞歸行爲作爲循環。在這種情況下,只需在下一個項目調用顯示後打印出相反的項目,或者在標準訂單之前。

public display() { 
    doDisplay(this); 
} 

private void doDisplay(LinkedListImpl item) { 
    if(item.next) // implicit != null 
    { 
     doDisplay(item.next); 
    } 
    System.out.println("\n\t" + temp.element + "\n"); // this line goes before 
                 // the if statement for 
                 // regular ordering 
} 
+0

@justkt - 您的代碼正在跳過顯示第一個元素。你可以修改,這樣我們可以投票嗎?謝謝。 **編輯**您放入的第二個示例將執行列表元素的反向顯示。 – Perception

+0

@Perception - 編輯好。 – justkt

+0

@justkt你現在可以看到我的問題。我編輯了它 –

0

Java沒有像C那樣在函數內聲明變量爲靜態的能力。我不明白爲什麼你認爲你需要一個靜態變量...

+0

我已編輯我的問題對不起,我已經離開遞歸調用。請現在看到我的問題 –

0

static變量聲明就像普通的實例變量與靜態關鍵字。用方法聲明它們是非法的。另外,爲什麼不使用this而不是將它分配給一個變量?

0

對於打印以相反的順序列表,你可以使用一個輔助方法:

public void display() { 
    displayHelper(this); 
} 

private void displayHelper(LinkedListImp temp) { 
    if (temp.next != null) 
     displayInternal(temp.next); 

    System.out.println("\n\t"+ temp.element +"\n");; 
} 
+0

hernandez rishmawy非常感謝你的建議 –

0

遞歸工作正常。我們甚至不需要輔助方法。

public void display() 
{ 
    // Displays in reverse order. For forwards order, do it the other way around. 
    if (next != null) { next.display(); } 
    System.out.println("\n\t"+ element +"\n"); 
}