一个类包含相同类的对象的堆栈实现

时间:2019-08-14 02:00:46

标签: c#

我已经阅读了C#中的Stack实现代码。

该代码正在运行,但是我不知道在同一个类中包含一个类的对象是否非法(我确定它是合法的,因为我可以编译)。代码如下。

  "Autofac/4.2.1": {
    "dependencies": {
      "System.ComponentModel": "4.0.1"
    },
    "runtime": {
      "lib/netstandard1.1/Autofac.dll": {
        "assemblyVersion": "4.2.1.0",
        "fileVersion": "4.2.1.0"
      }
    }
  }

代码已编译并可以正常运行。

我很困惑,在Entry类内部,它具有Entry类的字段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; } } }

此外,当Stack调用Push方法时,它会调用Entry构造函数,该函数将next设置为this.next,但是我不知道它是如何工作的,next会指向对象this.next,但要在何处以及如何创建对象“下一个”。

如果有人可以帮助我理解以上代码,我将非常感激。

2 个答案:

答案 0 :(得分:3)

字段next存储对另一个对象Entry的引用,或空引用。请注意,next 可以为空

您的困惑可能来自误解,即创建一个Entry时,您必须首先需要一个Entry的实例,乍一看似乎很循环。但是,请注意,您可以将null作为第一个参数:

Entry entry1 = new Entry(null, someObject);

本质上,Entry代表链表中的一个节点,该链表又用于实现堆栈:

A ---> B ---> C

next中的ABnext中的BCnext中的C是什么?是null

答案 1 :(得分:0)

那样的工作流程

  1. Push(),top = new Entry(top, data);(A),top.next <---空
  2. Push(),top = new Entry(top, data);(B),top.next <---(A)
  3. Push(),top = new Entry(top, data);(C),top.next <---(B)
  4. Pop(),返回(C),顶部=(B);
  5. Pop(),返回(B),顶部=(A);
  6. Pop(),返回(A),top = null;
  7. Pop(),因为现在InvalidOperationException抛出了top == null

    第一个问题(对象“ next”在何处以及如何创建)

第一次推送是SPECIALY,接下来是null,但是还可以,因为当pop()时,它具有null检查。