java - 队列作为链表实现

标签 java linked-list queue variable-assignment

这是我在数据结构中的分配程序,用于实现 QueueAsArray。我希望有人指导我解决这个问题,因为我在 Java 编程方面没有很强的背景。

我希望有人指导我如何在我的主程序中编译和使用此代码。

public class QueueAsLinkedList extends AbstractContainer implements Queue
{
    protected LinkedList list;

    public QueueAsLinkedList ()
    { list = new LinkedList (); }

    public void purge ()
    {
    list.purge ();
    count = 0;
    }

    public Object getHead ()
    {
    if (count == 0)
        throw new ContainerEmptyException ();
    return list.getFirst ();
    }

    public void enqueue (Object object)
    {
    list.append (object);
    ++count;
    }

    public Object dequeue ()
    {
    if (count == 0)
        throw new ContainerEmptyException ();
    Object result = list.getFirst ();
    list.extract (result);
    --count;
    return result;
    }

    public Enumeration getEnumeration()
    {
        return new Enumeration()
        {
            protected LinkedList.Element position = list.getHead();

            public boolean hasMoreElements()
            {
                return position != null;
            }

            public Object nextElement()
            {
                if (position == null)
                    throw new NoSuchElementException();
                Object result = position.getDatum();
                position = position.getNext();
                return result;
            }
        };
    }

    protected int compareTo (Comparable object)
    {
        AbstractContainer arg = (AbstractContainer) object;

        long diff = (long) getCount() - (long) arg.getCount();
        if (diff < 0)
            return -1;
        else if (diff > 0)
            return +1;
        else
            return 0;
    }

    public boolean equals(Object object) {
        LinkedList list_object = (LinkedList)object;
        if(list_object.length != this.length) {
            return false;
        }
        Element ptr = this.head;
        Element list_object_ptr = list_object.head;
        for(int i = 0; i < this.length; i++) {          
            if(list_object_ptr.getDatum () != ptr.getDatum ()) {
                return false;
            }
            ptr = ptr.getNext ();
            list_object_ptr = list_object_ptr.getNext ();
        }
        return true;
    }
}

最佳答案

我对您的建议是阅读现有的 LinkedList 库源代码,您可以轻松找到这些内容。我建议您还阅读 ArrayList 的源代码,因为您将包装一个数组。最后看一下ArrayBlockingQueue,因为这是一个包装数组的队列。最后一个类最接近您想要的,但也是最复杂的,因为它是并发且线程安全的。

当你开始编写一个类时,我建议你从一些非常简单的东西开始,然后对其进行编译。使用 IDE,它会在您键入代码时显示代码是否可以编译并建议更正。

然后我会编写一个非常简单的单元测试来测试您非常简单的代码。您只需使用一种方法即可做到这一点。 (有些人建议先编写测试用例,但我发现这非常困难,除非您之前编写过此类类,在这种情况下,您并不是真正先编写单元测试,而只是第一次编写该代码库)

然后添加第二个或第三个方法并对其进行测试。

当它执行您不理解的操作时,请使用调试器单步执行代码以查看每一行的作用。

<小时/>

我会使用 Netbeans、Eclipse 或 IntelliJ CE 等 IDE。我更喜欢 IntelliJ,但 Netbeans 可能最适合初学者。

  • 下载 IDE。
  • 开始一个新项目。
  • 创建一个类并将代码复制并粘贴到该类中。
  • 创建另一个使用该类的类。这是你的课。

顺便说一句,这个类是你写的还是因为它有很多不寻常的编码选择而给你的。

<小时/>

代码注释

  • 它是一个队列,它包装了一个实现队列的类,因此委托(delegate)看起来很自然,但它似乎并没有这样做,这表明 LinkedListQueue 不是标准的 LinkedList 和 Queue 令人困惑。
  • 它使用未定义的字段 count 来代替 LinkedList.size()。
  • 出队访问 LinkedList 两次,一次会更有效(就像标准库那样)
  • 当 Iterator 自 Java 1.2 (1998) 起成为标准时,它支持 Enumeration 而不是 Iterator
  • 当 equals 为 false 时,compareTo 为 0,这是一个错误。
  • 它不支持内置泛型。
  • compareTo 仅检查长度,因此具有“A”的队列和具有“Z”的队列compareTo == 0
  • equals 使用的 this.headthis.length 不是字段。

关于java - 队列作为链表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11807146/

相关文章:

java - 禁用 osgi 临时文件夹

java - IVY Build,如何在项目中使用extlib目录?

java - 服务器已经运行时如何在实体中动态传递模式

无法正确解码多项式

python - python中的出列函数

java - 队列的线程安全映射

Java switch 语句要求输入两次

Java如何返回扩展接口(interface)的泛型类型

swift - 从反向链表中提取值

c - C 中不正确的插入队列