• 数据结构与算分之-队列的概念和代码实现
  • 发布于 2个月前
  • 264 热度
    0 评论
概念
队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表。它按照先进先出的原则存储数据,先进入的数据,在读取数据时先被读取出来。

原理
向队列中插入数据
1.将尾节点的指针域指向新节点
2.将新节点作为新的尾节点

从队列中获取数据
1.获取第一个节点、第二个节点
2.将头节点的指针域指向第二个节点
3.将第一个节点的数据域的数据返回

示例
package wxw.mengyuan.demo;
import java.util.Iterator;

/**
 * 堆代码 duidaima.com
 * 队列
 */
public class Queue<T> implements Iterable<T> {

  /** 头节点 */
  private Node<T> head;
  /** 尾节点 */
  private Node<T> foot;
  /** 存储的数据个数 */
  private int N;

  /**
   * 内部节点类
   */
  private static class Node<T> {
    // 当前节点存储的数据
    private T data;
    // 指向下一个节点的指针
    private Node<T> next;

    /**
     * 构造方法
     */
    public Node(T data, Node<T> next) {
      this.data = data;
      this.next = next;
    }
  }

  /**
   * 构造方法
   */
  public Queue() {
    // 初始化头节点
    head = new Node<>(null, null);
    // 初始化尾节点
    foot = null;

    // 初始化存储的数据个数
    N = 0;
  }

  /**
   * 向队列中插入数据
   *
   * 原理
   * (1) 将尾节点的指针域指向新节点
   * (2) 将新节点作为新的尾节点
   *
   * @param data 新节点的数据
   */
  public void enqueue(T data) {
    // 创建新节点
    Node<T> newNode = new Node<>(data, null);

    if (isEmpty()) {
      // 队列中没有数据时,那么将新节点作为尾节点
      foot = newNode;
      // 让头节点指向新的尾节点
      head.next = foot;
    } else {
      // 队列中有数据时,那么将新节点作为节点的下一个节点
      foot.next = newNode;
      // 设置新节点为新的节点
      foot = newNode;
    }

    // 存储的数据个数+1
    N++;
  }

  /**
   * 从队列中获取数据
   *
   * 原理
   * (1) 获取第一个节点、第二个节点
   * (2) 将头节点的指针域指向第二个节点
   *
   * @return 第一个结点中的数据
   */
  public T dequeue() {
    // 如果队列中没有数据,直接返回null
    if (isEmpty()) {
      return null;
    }
    // 获取第一个节点
    Node<T> firstNode = head.next;
    // 让头节点指向第二节点
    head.next = firstNode.next;
    // 将第一个节点的指针域置为null:便于释放资源
    firstNode.next = null;
    // 存储的数据个数-1
    N--;

    // 返回第一个结点的数据
    return firstNode.data;
  }

  /**
   * 遍历队列
   */
  @Override
  public Iterator<T> iterator() {
    return new QueueIterator();
  }

  /**
   * 内部类:用于遍历
   */
  private class QueueIterator implements Iterator<T> {
    // 当前节点,默认指向头节点
    private Node<T> node = head;

    /**
     * 判断是否还有下一个节点
     */
    @Override
    public boolean hasNext() {
      return node.next != null;
    }

    /**
     * 获取下一个节点中的数据
     */
    @Override
    public T next() {
      // 获取下一个节点
      node = node.next;
      // 返回下一个节点中的数据
      return node.data;
    }
  }

  /**
   * 判断队列是否为空
   *
   * @return true:空队列
   */
  public boolean isEmpty() {
    return N == 0;
  }

  /**
   * 获取队列中存储的数据个数
   *
   * @return 队列中存储的数据个数
   */
  public int size() {
    return N;
  }

}

用户评论