• Java数据结构——队列


    队列
    只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);队列具有先进先出(FIFO)的特性。

    三种实现方式

    1. 顺序存储实现方式
    2. 链式存储实现方式
    3. 基于LinkedList实现队列结构


    顺序存储实现方式

    public class MyQueue {
    private Object[] data;
    private int maxSize = 10;
    private int front;
    private int rear;
    // 初始化队列
    public MyQueue(int maxSize) {
    if (maxSize >= 0) {
    this.maxSize = maxSize;
    data = new Object[maxSize];
    front = rear = 0;
    } else {
    throw new RuntimeException("初始化队列大小不能小于0");
    }
    }
    // 判空
    public boolean empty() {
    return rear == front ? true : false;
    }
    // 入队
    public boolean add(Object obj) {
    if (rear == maxSize) {
    throw new RuntimeException("队满");
    } else {
    data[rear++] = obj;
    return true;
    }
    }
    // 出队
    public Object poll() {
    if (front == rear) {
    throw new RuntimeException("队空");
    } else {
    Object value = data[front];
    data[front++] = null;
    return value;
    }
    }
    // 查看队首元素
    public Object peek() {
    if (front == rear) {
    throw new RuntimeException("队空");
    } else {
    return data[front];
    }
    }
    // 返回队列长度
    public int length() {
    return rear - front;
    }
    public static void main(String[] args) {
    MyQueue queue = new MyQueue(5);
    queue.add(1);
    queue.add(2);
    queue.add(3);
    queue.add(4);
    queue.add(5);
    System.out.println(queue.length());
    System.out.println(queue.empty());
    System.out.println(queue.peek());
    System.out.println(queue.poll());
    System.out.println(queue.peek());
    }
    }
    

      

    链式存储实现方式

    public class MyLinkedQueue {
    // 定义节点的内部类
    public class Node {
    Node next;
    Object data;
    public Node(Object data) {
    super();
    this.data = data;
    }
    }
    private Node rear;
    private Node front;
    private int maxSize = 10;
    private int size;
    // 初始化队列
    public MyLinkedQueue(int maxSize) {
    if (maxSize >= 0) {
    this.maxSize = maxSize;
    rear = front = null;
    size = 0;
    } else {
    throw new RuntimeException("初始化队列大小不能小于0");
    }
    }
    // 判空
    public boolean empty() {
    return size == 0 ? true : false;
    }
    // 入队
    public boolean add(Object data) {
    if (size == maxSize) {
    throw new RuntimeException("队满");
    } else if (empty()) {
    front = new Node(data);
    rear = front;
    size++;
    return true;
    } else {
    Node node = new Node(data);
    rear.next = node;
    rear = node;
    size++;
    return true;
    }
    }
    // 出队
    public Object poll() {
    if (empty()) {
    throw new RuntimeException("队空");
    } else {
    Node node = front;
    front = front.next;
    node.next = null;
    size--;
    return node.data;
    }
    }
    // 返回队首元素
    public Object peek() {
    if (empty()) {
    throw new RuntimeException("队空");
    } else {
    return front.data;
    }
    }
    // 返回长度
    public int length() {
    return size;
    }
    public static void main(String[] args) {
    MyLinkedQueue queue = new MyLinkedQueue(5);
    queue.add(1);
    queue.add(2);
    queue.add(3);
    queue.add(4);
    queue.add(5);
    System.out.println(queue.length());
    System.out.println(queue.empty());
    System.out.println(queue.peek());
    System.out.println(queue.poll());
    System.out.println(queue.peek());
    }
    }
    

      

    基于LinkedList实现队列结构

    import java.util.LinkedList;
    import java.util.Queue;
    
    public class MyListQueue {
    private Queue<Object> queue = new LinkedList<>();
    // 将元素入队,如果当前没有可用的空间,则抛出 IllegalStateException
    public boolean add(Object data) {
    queue.add(data);
    return true;
    }
    // 将元素入队,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
    public boolean offer(Object data) {
    queue.offer(data);
    return true;
    }
    // 取队首元素
    public Object element() {
    return queue.element();
    }
    // 取队首元素方法二
    public Object peek() {
    return queue.peek();
    }
    // 获取并移除此队列的队首元素
    public Object poll() {
    return queue.poll();
    }
    // 获取并移除此队列的队首元素方法二
    public Object remove() {
    return queue.remove();
    }
    // 获取并移除此队列的队首元素方法三,指定移除元素
    public boolean remove1(Object data) {
    return queue.remove(data);
    }
    // 判空
    public boolean empty() {
    return queue.isEmpty();
    }
    // 打印
    public String toString() {
    return queue.toString();
    }
    public static void main(String[] args) {
    MyListQueue queue = new MyListQueue();
    queue.add(1);
    queue.add(2);
    queue.add(3);
    queue.offer(4);
    queue.offer(5);
    queue.offer(6);
    System.out.println(queue.toString());
    System.out.println(queue.empty());
    System.out.println(queue.element());
    System.out.println(queue.peek());
    System.out.println(queue.toString());
    System.out.println(queue.poll());
    System.out.println(queue.remove());
    System.out.println(queue.remove1(5));
    System.out.println(queue.toString());
    }
    }
  • 相关阅读:
    web.xml配置文件
    数组去重问题
    Mysql优化
    点赞功能
    IDEA的一些使用小技巧
    Maven
    AJAX
    HTTP响应头拆分/CRLF注入详解
    对寄存器ESP和EBP的一些理解
    汇编调用指令的执行过程
  • 原文地址:https://www.cnblogs.com/ericz2j/p/10517009.html
Copyright © 2020-2023  润新知