【问题标题】:Double ended deque双端双端队列
【发布时间】:2018-07-02 20:00:09
【问题描述】:

我正在制作一个双端双端队列。我收到一个错误:Deque<String> d = new Deque<String>(); 错误是 Deque 不接受参数。

这是我的双端队列:

import com.sun.org.apache.xpath.internal.operations.String;
import java.util.Iterator;


public abstract class Deque implements DoubleEndedQueue<Object>,Iterator<Object> {

private static Node<Object> first;
private static Node<Object> last;

private static int size = 0;

public Deque() {
    size = 0;
    first = null;
    last = null;
}

private static class Node<Object> {

    Object item;
    Node<Object> prec;
    Node<Object> next;
}

DoubleEndedQueue<Object> d = new DoubleEndedQueue<Object>() {

        @Override
        public boolean isEmpty() {
            return size == 0;
        }

        @Override
        public int size() {
            return size;
         }

        @Override
        public void pushLeft(Object item) {
            Node<Object> newNode = new Node<Object>();
            newNode.item = item;
            if (size == 0) {
                first = last = newNode;
            } else {
                newNode.next = first;
                first.prec = newNode;
            }
            first = newNode;
            if (last == null) {
                last = first;
            }
            size++;
        }

        @Override
        public void pushRight(Object item) {
            Node<Object> newNode = new Node<Object>();
            newNode.item = item;

            if (size == 0) {
                last = first = newNode;
            } else {
                newNode.prec = last;
                last.next = newNode;
            }
            last = newNode;
            if (first == null) {
                first = last;
            }
            ++size;
        }

        @Override
        public Object popLeft() {
            Node<Object> newNode = new Node<Object>();
            newNode = first;
            first = first.next;

            if (first == null) {
                last = null;
            } else {
                first.prec = null;
            }

            size--;

            return newNode.item;
        }

        @Override
        public Object popRight() {
            Node<Object> newNode = new Node<Object>();
            newNode = last;
            last = newNode.prec;

            if (last == null) {
                first = null;
            } else {
                last.next = null;
            }

            size--;

            return newNode.item;
        }

        @Override
        public Object changeLeft(int n, Object newItem) {
            Node<Object> newNode = new Node<Object>();
            newNode = first;
            for (int i = 0; i < n; i++) {
                newNode = newNode.next;
            }
            return newNode.item = newItem;
        }

        @Override
        public Object changeRight(int n, Object newItem) {
            Node<Object> newNode = new Node<Object>();
            newNode = last;
            for (int i = 0; i < n; i++) {
                newNode = newNode.prec;
            }
            return newNode.item = newItem;
        }



    };

 public Iterator<Object> iterator() {
    return new Iterator<Object>() {

        private Node<Object> node = first;

        @Override
        public boolean hasNext() {
            return node != null;
        }

        @Override
        public Object next() {
            Object item = node.item;
            node = node.next;

            return item;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    };
}

public interface Iterable<Object> {
   Iterable<Object> iterator();
}

public static void main(String[] args) {
    Deque<String> d = new Deque<String>();
    d.pushLeft("im first");
    d.pushLeft("im second");
    d.pushRight("im third");
    d.pushRight("im fourth");
    d.pushLeft("im fifth");
    d.pushRight("im sixth");
    d.changeLeft(1, "well");
    d.changeRight(2, "this");
    d.changeLeft(1, "was");
    d.changeRight(3, "fun");
    d.popRight();
    d.popLeft();


}

}

【问题讨论】:

  • 嗯,它不带参数。你了解 Java 泛型是如何工作的吗?如果您希望一个类是通用的,那么在任何地方都使用&lt;Object&gt; 不是您的做法。
  • 你还声明了 Deque 抽象,所以 new Deque() 不能很好地工作。

标签: java data-structures deque


【解决方案1】:

这里有几个问题:

  1. Dequeabstract,这意味着您不能使用 new 实例化它。
  2. Deque 类中,您在DoubleEndedQueue 上调用new,但看起来这是一个接口。不能在接口上调用new
  3. 您可能可以采用“new DoubleEndedQueue”中的重写方法并将其直接放在您的Deque 类中,然后去掉抽象。

希望这会为您指明正确的方向。

【讨论】:

    【解决方案2】:

    因为在创建对象时您使用的是泛型,而不是在创建类时。 您需要提供—— 公共抽象类 Deque 实现 DoubleEndedQueue,Iterator {}

    【讨论】: