【问题标题】:Queue Using Linked List使用链表排队
【发布时间】:2012-07-17 13:49:59
【问题描述】:

我正在用 Java 实现一个链接队列。但是,当我运行我的代码时会出现错误。

public class LinkedQueue<E> implements Queue<E> {
   private int count;
   private Node<E> front, rear;

   public LinkedQueue() {
      count = 0;
      front = rear = null;
   }

   public void enqueue (E element) {
      Node<E> node = new Node<E> ();

      if (isEmpty())
         front = node;
      else
         rear.setNext (node);

      rear = node;
      count++;
   }

   public E dequeue() throws QueueEmptyException {
      if (isEmpty())
         throw new QueueEmptyException  ("queue");

      E result = front.getElement();
      front = front.getNext();
      count--;

      if (isEmpty())
         rear = null;

      return result;

   }

   public E first() throws QueueEmptyException {
      if (isEmpty())
         throw new QueueEmptyException ("queue"); 

      return front.getElement();
   }


   public boolean isEmpty() {
      return (front == rear);
   }


   public int size() {
      return count;
   }


    public E front() throws QueueEmptyException {       
        if (isEmpty())
            throw new QueueEmptyException("Queue underflow.");
        return (E) front.getNext();
    }
}

我一直在配置 LinkedQueue 中的问题。请帮我修复代码。我是 Java 新手,可能错误是由语法错误引起的。

【问题讨论】:

  • 您遇到了什么错误?你正在运行什么代码来获取它们?
  • 这是作业吗?在这种情况下,请相应地标记它......否则你会得到什么错误消息?

标签: java linked-list queue


【解决方案1】:

您可以使用 java.util.LinkedList 泛型类中的队列的所有功能。使用 addLast 方法使元素入队,并使用 removeFirst 方法使元素出队。由于 LinkedList 是双向链接的,您应该会看到队列的所有性能优势。

【讨论】:

    【解决方案2】:

    java.util.LinkedList 已经实现了Queue
    为什么不用那个?

    Queue<T> queue = new LinkedList<>();
    

    【讨论】:

    • 我被要求使用长方法链接队列。
    • 长方法链接队列是什么意思?
    • 也就是说,我的意思是不要使用内置的 Java 队列命令或您所说的任何东西 :)
    【解决方案3】:

    您的 enqueue() 方法对传入的元素不执行任何操作。可能您想将它传递给节点的构造函数?

    【讨论】:

    • 您好,先生。嗯,你能教我如何在节点上传递它吗?我对那些泛型感到困惑。
    • 只需将元素传递给 Node 构造函数:Node&lt;E&gt; node = new Node&lt;E&gt; (element, null);。您可能应该删除构造函数的第二个参数,因为它始终是null
    • 第一次调用 enqueue() 后,frontrear都指向添加的节点。您对isEmpty() 的实现然后返回true!您应该更改isEmpty() 的实现以检查count == 0
    【解决方案4】:

    这看起来非常可疑:

    public void enqueue (E element) {
      Node<E> node = new Node<E> ();
    
      if (isEmpty())
         front = node;
      else
         rear.setNext (node);
    
      rear = node;
      count++;
    

    }

    从不使用参数element。试试

    Node<E> node = new Node<E> (element);
    

    什么的。

    【讨论】:

      【解决方案5】:

      这里是使用队列的链表的示例实现。

      public class LinkedQueue<E> {
      
          private DoublyLinkedNode<E> head;
          private DoublyLinkedNode<E> tail;
      
          int size;
      
          public void enqueue(E item) {
      
              DoublyLinkedNode<E> oldTail = this.tail;
      
              DoublyLinkedNode<E> newTailnode = new DoublyLinkedNode<E>(item);
      
              if(oldTail != null){
                  oldTail.setNextNode(newTailnode);
                  newTailnode.setNextNode(null);
                  this.tail = newTailnode;
      
              }else{
                  this.tail = newTailnode;
                  this.head = newTailnode;
              }
              size++;
          }
      
          public boolean isEmpty() {
              return this.head == null;
          }
          public int length(){
              return size;
          }
      
          public E deque() {
              if (isEmpty()) {
                  throw new NoSuchElementException("Queue underflow");
              }
      
              E data = this.head.getData();
      
              this.head = this.head.getNextNode();
      
              size--;
      
              return data;
          }
      
          public E peek() {
              return this.head.getData();
          }
      
          public static void main(String[] args) {
              LinkedQueue<Double> queuelist = new LinkedQueue<Double>();
              queuelist.enqueue(60.0);
              queuelist.enqueue(12.0);
              queuelist.enqueue(16.4);
              queuelist.enqueue(26.5);
      
              queuelist.deque();
              System.out.println("queuelist.peek:"+ queuelist.peek());
      
              queuelist.deque();
              System.out.println("queuelist.length:"+queuelist.length());
              System.out.println("queuelist.peek:"+ queuelist.peek());
          }
      }
      
      public class DoublyLinkedNode<E> {
          private E data;
          private DoublyLinkedNode<E> nextNode;
          private DoublyLinkedNode<E> previousNode;
      
          public DoublyLinkedNode(E data) {
              this.data = data;
          }
          public E getData() {
              return data;
          }
          public DoublyLinkedNode<E> getNextNode() {
              return nextNode;
          }
          public void setNextNode(DoublyLinkedNode<E> nextNode) {
              this.nextNode = nextNode;
          }
      
          public DoublyLinkedNode<E> getPreviousNode() {
              return previousNode;
          }
      
          public void setPreviousNode(DoublyLinkedNode<E> prevNode) {
              this.previousNode = prevNode;
          }
      
          @Override
          public String toString() {
              return this.data.toString();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-05-10
        • 2022-01-25
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多