簡體   English   中英

在 java 中模擬一個簡單的調用棧

[英]Simulating a simple Call Stack in java

我正在嘗試在 java 中模擬一個簡單的調用堆棧,並使用我之前實現的簡單數學函數(例如 Fibonacci、Factorial)運行它。

邏輯明智的是我正在嘗試做的事情:

每當調用方法時,將“堆棧框架”推送到常規堆棧上。

• 棧幀將包含局部變量、參數

• 將方法名稱和arguments 作為字符串存儲到堆棧中。

• 當方法退出時,這些值從堆棧中彈出。

• 應該能夠通過調用display()方法隨時顯示“調用堆棧”。 (已經在我的堆棧類中實現)

我在理解它的邏輯時遇到了一些麻煩,這就是我目前所擁有的:

public class CallStack 
{
    public static void main(String[] args)
    {
        int num1 = 5; 
        int num2 = 10; 
        MyStack B = new MyStack(3); 

        Fibonacci.CalcFib(num1); 
        B.push("Fibonacci.CalcFib(num1)");
        B.push(String.valueOf(num1));
        B.display();  
        B.pop();  

        System.out.println();
        Factorial.CalcFact(num2);
        B.push("Factorial.CalcFib(num2)");
        B.push(String.valueOf(num2));
        B.display();
        B.pop(); 
    }
}

我知道這不是它應該如何實現的,但我似乎無法理解 go 我還能如何做到這一點。 以及我如何在完成后將該方法從堆棧中彈出。

任何幫助/提示將不勝感激,謝謝!

您要實現的內容已經在 Java 編程語言及其運行時實現中。 你不能和它混在一起,那很好。

所以下定決心:用你選擇的任何語言創建你自己的編程語言和解釋器,你可以完全控制堆棧和變量,或者接受 Java 為你做這件事,你最好的可見性是使用調試器。

幾乎所有的大學都有 model 台計算機和適當的 model 語言來進行這樣的學習練習,所以它並不是完全脫離世界。

您應該研究的第一件事是反向波蘭表示法 (RPN),這是一種表達算術運算的方式,function 調用可以輕松轉換為堆棧。

在 RPN 中,中綴表達式:

2 + 3 * 5

寫成:

2 3 5 * +

它是通過將操作數壓入堆棧來處理的。 當遇到運算符時,彈出並計算所需參數的數量,並將結果推回堆棧。

因此,在此示例中,將推送 2 3 和 5。 當遇到 * 時,3 和 5 被彈出並相乘,結果 (15) 被壓入。 當遇到 + 時,彈出並添加 2 和 15,然后推送結果。 結果留在堆棧中。

方法調用與運算符的工作方式相同。 (事實上,運算符可以被認為是“特殊”方法)。 例如:

substr("hello", 2, 4)

會寫成:

"hello" 
2 
4
new MethodName("substr")

對於最后一項,我將方法名稱包裝在MethodName類型的 object(我發明的 class)中,以將其與String類型區分開來。

您會將這些項目存儲在 Java Stack<Object>類型中,並在其中使用pushpop操作。

在將 arguments 和方法名稱從堆棧中彈出后,您將不得不編寫大量代碼來解釋您擁有的內容並調用適當的 function,使用反射或對方法調用進行硬編碼。

我不准備 go 了解更多細節,因為這是相當多的工作。 如果這是一個練習,那么您將不得不自己解決其中的一些問題。 如果不是,那么有圖書館可以做這種事情。 例如,傑普。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM