繁体   English   中英

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

[英]Stack implementation that a class contains an object of the same class

我已经阅读了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类内部,Entry类next有一个字段。

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

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

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

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

Entry entry1 = new Entry(null, someObject);

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

A ---> B ---> C

Anext AB B nextC Cnext是什么? 它是null

这样的工作流程

  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),top =(B);
  5. Pop(),return(B),top =(A);
  6. Pop(),返回(A),top = null;
  7. Pop(),因为现在top == null ,所以抛出InvalidOperationException

    还有第一个问题(在哪里以及如何创建对象“ next”)

首先是SPECIALY,接下来是null,但是还可以,因为当pop()时,它具有null检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM