📜  队列数据结构(1)

📅  最后修改于: 2023-12-03 15:42:23.390000             🧑  作者: Mango

队列数据结构

队列是一种基本的线性数据结构,它具有先进先出(FIFO)的特点。简单来说,就是先进入队列的元素先被取出,后进入的元素后被取出。

队列的实现

队列主要有两种实现方式:数组实现和链表实现。

数组实现

数组实现的队列是通过数组来存储队列中的元素,同时使用两个指针 frontrear 分别指向队列的头部和尾部。

public class ArrayQueue {
    private int[] array;
    private int front;
    private int rear;
    private int capacity;

    // 构造方法
    public ArrayQueue(int size) {
        array = new int[size];
        capacity = size;
        front = -1;
        rear = -1;
    }
    
    // 判断队列是否为空
    public boolean isEmpty() {
        return (front == -1) || (front == rear + 1);
    }
    
    // 判断队列是否已满
    public boolean isFull() {
        return rear == capacity - 1;
    }
    
    // 入队
    public void enqueue(int data) {
        if (isFull()) {
            System.out.println("队列已满!");
        } else {
            if (front == -1) {
                front = 0;
            }
            rear++;
            array[rear] = data;
        }
    }
    
    // 出队
    public int dequeue() {
        int data = 0;
        if (isEmpty()) {
            System.out.println("队列为空!");
        } else {
            data = array[front];
            front++;
        }
        return data;
    }
}
链表实现

链表实现的队列是通过链表来存储队列中的元素,同时使用两个指针 frontrear 分别指向队列的头部和尾部。

public class LinkedListQueue {
    private Node front;
    private Node rear;

    // 构造方法
    public LinkedListQueue() {
        front = null;
        rear = null;
    }

    // 判断队列是否为空
    public boolean isEmpty() {
        return (front == null) && (rear == null);
    }

    // 入队
    public void enqueue(int data) {
        Node newNode = new Node(data);

        if (rear == null) {
            front = rear = newNode;
        } else {
            rear.setNext(newNode);
            rear = newNode;
        }
    }

    // 出队
    public int dequeue() {
        int data;
        if (isEmpty()) {
            System.out.println("队列为空!");
            return -1;
        } else {
            data = front.getData();
            front = front.getNext();

            if (front == null) {
                rear = null;
            }
            return data;
        }
    }

    // 内部类节点
    class Node {
        private int data;
        private Node next;

        public Node(int data) {
            this.data = data;
            next = null;
        }

        public int getData() {
            return data;
        }

        public void setData(int data) {
            this.data = data;
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }
    }
}
队列的应用

队列的应用非常广泛,特别是在处理一些与时间有关的问题时,例如:

  • 等待队列:请求被处理前需要先进入队列等待;
  • 计算机系统调度:操作系统在控制进程时,通常使用队列来实现调度;
  • 广度优先搜索:使用队列来存储要访问的节点;
  • 生产者-消费者问题:队列用来存储生产者生产的数据,消费者从队列中获取数据进行处理。
总结

队列数据结构是一种非常基础的数据结构,具有先进先出的特点,在实际应用中有着广泛的应用。我们可以利用数组或链表来实现队列,具体实现方式根据需求的不同而选择。