[英]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>
類型中,並在其中使用push
和pop
操作。
在將 arguments 和方法名稱從堆棧中彈出后,您將不得不編寫大量代碼來解釋您擁有的內容並調用適當的 function,使用反射或對方法調用進行硬編碼。
我不准備 go 了解更多細節,因為這是相當多的工作。 如果這是一個練習,那么您將不得不自己解決其中的一些問題。 如果不是,那么有圖書館可以做這種事情。 例如,傑普。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.