我讀過一段C#中Stack實現的代碼。該代碼正在工作,但我不明白在同一個類中擁有一個類的對象是否非法(我確信它是合法的,因為我可以編譯它)。代碼如下。public class Stack{ Entry top; public void Push(object data){ top = new Entry(top, data); } public object Pop(){ if(top==null) throw new InvalidOperationException(); object result = top.data; top = top.next; return result; } class Entry{ public Entry next;//? public object data; public Entry(Entry next, object data){ this.next = next; this.data = data; } }}代碼已編譯并運行正常。我很困惑,在 Entry 類內部,它有一個nextEntry 類字段。此外,當 Stack 調用 Push 方法時,它會調用 Entry 構造函數,該構造函數設置為this.next,next但我不明白這是如何工作的,this.next它將指向 object next,但“下一個”對象在哪里以及如何創建。如果有人能幫助我理解上面的代碼,我將非常感激。
2 回答
嚕嚕噠
TA貢獻1784條經驗 獲得超7個贊
該字段next存儲對另一個對象的引用Entry,或空引用。請注意,next 可能為空!
您的困惑可能來自于這樣的誤解:要創建一個Entry,您必須需要一個Entryfirst 的實例,乍一看這似乎很循環。但是,請注意,您可以null作為第一個參數傳遞:
Entry entry1 = new Entry(null, someObject);
本質上,Entry表示鏈表中的一個節點,而該節點又用于實現堆棧:
A ---> B ---> C
的next是。A_ 的是。是什么的?是!BnextBCnextCnull
江戶川亂折騰
TA貢獻1851條經驗 獲得超5個贊
工作流程就這樣
Push() ,
top = new Entry(top, data);(A) ,top.next<--- null推(),
top = new Entry(top, data);(B),top.next<---(A)推(),
top = new Entry(top, data);(C),top.next<---(B)Pop() , 返回 (C) , 頂部 = (B);
Pop() , 返回 (B) , 頂部 = (A);
Pop() , 返回 (A) , 頂部 = null ;
Pop() ,
InvalidOperationException因為top == null現在就拋出。你的第一個問題(“下一個”對象在哪里以及如何創建)
第一次推送是特別的,接下來是 null ,但是沒關系,因為當 pop() 時,它有 null 檢查。
- 2 回答
- 0 關注
- 176 瀏覽
添加回答
舉報
0/150
提交
取消
