【问题标题】:C# Linked List enqueue and dequeue method syntaxC# 链表入队和出队方法语法
【发布时间】:2017-05-14 14:08:03
【问题描述】:

我有一个项目要求我们使用链表堆栈(NodeStack)和队列(NodeQueue)。我有这个示例代码可以使用:

class Node
{
    object value;
    Node next;

    public void setValue(object o)
    {
        value = o;
    }

    public object getValue()
    {
        return value;
    }

    public void setNext(Node o)
    {
        next = o;
    }

    public Node getNext()
    {
        return next;
    }
}

class NodeStack
{
    Node top;
    int count;

    public void Push(object o)
    {
        Node newTop = new Node();
        newTop.setValue(o);
        newTop.setNext(top);

        top = newTop;
        count = count + 1;
    }

    public object Pop()
    {
        object value = top.getValue();
        top = top.getNext();
        return value;
    }

    public object Peek()
    {
        return top.getValue();
    }

    public void Clear()
    {
        top = null;
        count = 0;
    }

    public int Count()
    {
        return count;
    }
}

从这段代码中,我应该能够将NodeStack 派生为NodeQueue,但我无法理解EnqueueDequeue 方法的语法。当我运行一个简单的入队和出队程序时,我在出队方法的第一行得到一个空引用异常。非常感谢您的帮助。

到目前为止我的代码:

class NodeQueue
{
    Node tail;
    Node head;
    int count;

    public void Enqueue(object o)
    {
        if (head == null)
        {
            Node newHead = new Node();
            newHead.setValue(o);
            head = tail = newHead;
            newHead.setNext(tail);
        }
        else
        {
            Node newTail = new Node();
            newTail.setValue(o);
            newTail.setNext(tail);
            tail = newTail;
        }
        count++;
    }

    public object Dequeue()
    {
        object value = head.getValue();
        head = head.getNext();
        return value;

    }

    public void Clear()
    {
        head = null;
        tail = null;
        count = 0;
    }

    public int Count()
    {
        return count;
    }
}

编辑:

已经处理了 NullException 的问题,但现在我遇到了 dequeue 的问题。我正在使用这个程序来测试队列

NodeQueue nq = new NodeQueue();
        nq.Enqueue(1);
        nq.Enqueue(2);
        nq.Enqueue(3);
        nq.Enqueue(4);
        nq.Enqueue(5);

        Console.WriteLine(nq.Dequeue());
        Console.WriteLine(nq.Dequeue());
        Console.WriteLine(nq.Dequeue());
        Console.WriteLine(nq.Dequeue());
        Console.WriteLine(nq.Dequeue());

        Console.ReadLine();

预期输出为 1..5。但发生的输出是 1 不断被打印出来。

【问题讨论】:

  • 这是作业。所以我只是轻轻推你一下。如果队列一开始是空的怎么办?当您尝试出队时,您认为您的代码会做什么?
  • @sinewaver 如果它是空的,那么我想它会发现value 为空并返回空异常?
  • 在您的 enqueue 方法中,您永远不会将 tail(或 head)设置为任何值。
  • 另外,Dequeue 不应该减少 count 吗?
  • @RufusL 哦,我明白了,谢谢。我明白了 sinwavever 现在想说的话。虽然有新问题

标签: c# linked-list nodes


【解决方案1】:

您的 Enqueuemethod 不正确,这就是您在“出队”中遇到异常的原因

同样在Dequeue 中,您应该将计数减一。

在你的Enqueue head 没有设置。

class NodeQueue
{
    Node tail;
    Node head;
    int count;

    public void Enqueue(object o)
    {
        if (head == null)
        {
            Node newHead = new Node();
            newHead.setValue(o);
            head = tail = newHead;
        }
        else
        {
            Node newTail = new Node();
            newTail.setValue(o);
            tail.setNext(newTail);
            tail = newTail;
        }
        count++;
    }

    public object Dequeue()
    {
        if (null != head)
        {
            object value = head.getValue();
            head = head.getNext();
            count--;
            return value;
        }
        return null;
    }

    public void Clear()
    {
        head = null;
        tail = null;
        count = 0;
    }

    public int Count()
    {
        return count;
    }
}

【讨论】:

  • 谢谢。不过我有一个新问题。当我运行程序时,它只会将我重复入队的第一个出队
  • 是的......它会出列第一个......因为队列是先进先出。是的,出队方法有更新。我会更新我的答案。
  • 请检查...你能在这里多解释一下你的问题吗“当我运行程序时,它只会让我重复排队的第一个出队”
  • 我将数字 1 到 5 排入队列。因此,当我出队时,它自然应该打印 1 2 3 4 5。会发生什么情况是它会打印 1 1 1 1 1。我编辑了上面的问题以添加代码我用来检查。
  • 你能使用我创建的“NodeQueue”类吗?它工作正常。我在我的系统中运行它。
猜你喜欢
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
相关资源
最近更新 更多