我读过一段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 回答
![?](http://img1.sycdn.imooc.com/5458655200013d9802200220-100-100.jpg)
噜噜哒
TA贡献1784条经验 获得超7个赞
该字段next
存储对另一个对象的引用Entry
,或空引用。请注意,next
可能为空!
您的困惑可能来自于这样的误解:要创建一个Entry
,您必须需要一个Entry
first 的实例,乍一看这似乎很循环。但是,请注意,您可以null
作为第一个参数传递:
Entry entry1 = new Entry(null, someObject);
本质上,Entry
表示链表中的一个节点,而该节点又用于实现堆栈:
A ---> B ---> C
的next
是。A
_ 的是。是什么的?是!B
next
B
C
next
C
null
![?](http://img1.sycdn.imooc.com/54584cb50001e5b302200220-100-100.jpg)
江户川乱折腾
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 关注
- 130 浏览
添加回答
举报
0/150
提交
取消