数据结构-队列(四)

一、队列的定义

  • 队列(queue)是一种只能在不同端进行插入或删除操作的线性表。
  • 进行插入的一端称做队尾(rear),进行删除的一端称做队头或队首(front)。
  • 队列的插入操作通常称为进队或入队(push),队列的删除操作通常称为出队或离队(pop)。

队列主要特点:

  • 先进先出,即先进队的元素先出队。
  • 每次进队的元素作为新队尾元素,每次出队的元素只能是队头的元素。
  • 队列也称为先进先出表。

二、队列顺序存储结构

基本算法实现,front队头指针指向队头元素前一个位置,rear指向队尾元素

public class MyQuequ_arr<E>{
    private int initcapacity = 100;
    private E[] data;
    private int front;
    private int rear;

    public MyQuequ_arr() {
        data = (E[]) new Object[initcapacity];
        front = rear = -1;
    }

    //队列基本运算
    /**
     * 进队
     * @param e
     */
    public void push(E e) {
        rear++;
        this.data[rear] = e;
    }

    /**
     * 出队,返回队头元素
     */
    public E pop() {
        if (front == rear) {
            return null;
        } else {
            front++;
            E e = this.data[front];
            return e;
        }
    }

    /**
     * 取队头元素
     */
    public E peek() {
        if ( front == rear) {
            return null;
        } else {
            return this.data[front+1];
        }
    }

    /**
     * 判断对列是否为空,若空返回真;否则返回假
     */
    public boolean empty() {
        return front==rear;
    }
}

循环队列

  • 队列满条件的判断
    • 标志位
    • 牺牲一个空间
public class MyQuequ_arr1<E>{
    private int initcapacity = 8;
    private E[] data;
    private int front;
    private int rear;

    public MyQuequ_arr1() {
        data = (E[]) new Object[initcapacity];
        front = rear = 0;
    }

    //队列基本运算
    /**
     * 进队
     * @param e
     */
    public void push(E e) {
        if( (rear + 1) %   initcapacity  == front) {
            throw new IndexOutOfBoundsException();
        }
        rear = (rear + 1) % initcapacity;
        data[rear] = e;
    }

    /**
     * 出队,返回队头元素
     */
    public E pop() {
        if(front == rear) {
            return null;
        }
        front = (front + 1) % initcapacity;
        return (E) data[front];
    }

    /**
     * 取队头元素
     */
    public E peek() {
        if(front == rear) {
            return null;
        }
        return (E) data[(front + 1) % initcapacity];
    }

    /**
     * 判断对列是否为空,若空返回真;否则返回假
     */
    public boolean empty() {
        return front==rear;
    }
}

三、队列链式存储结构

基本算法实现

public class MyQueue_link<E>{
    private Node<E> front; //队头
    private Node<E> rear; //队尾
    public static class Node<E>{
        E item;
        Node<E> next;

        public Node(E item, Node<E> next) {
            this.item = item;
            this.next = next;
        }
    }

    public MyQueue_link() {
        front = rear = null;
    }

    /**
     * 判断是否为空
     * @return
     */
    public boolean empty(){
        return front == null;
    }

    /**
     * 入队
     */
    public void push(E e){
        if(rear==null){
            front = rear = new Node<>(e,null);
        }else{
            Node<E> tNode = new Node<>(e,null);
            rear.next = tNode;
            rear = tNode;
        }
    }

    /**
     * 出队
     * @return
     */
    public E pop(){
        if(front==null){
            return null;
        }
        E e = front.item;
        front = front.next;
        return e;
    }

    public E peek(){
        if(front == null){
            return null;
        }
        return front.item;
    }
}

四、双端队列

deque (double-ended queue,双端队列)是一种具有队列的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

双端队列是限定插入和删除操作在表的两端进行的线性表。这两端分别称做端点1和端点2。也可像栈一样,可以用一个铁道转轨网络来比喻双端队列。在实际使用中,还可以有输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。

五、优先队列

优先队列就是指定队列中元素的优先级,按优先级越大越优先出队,而普通队列中按进队的先后顺序出队,可以看成进队越早越优先。

Java中提供了优先队列类PriorityQueue,已实现的接口有Queue

posted @ 2022-07-10 22:37  胡同咖啡  阅读(98)  评论(0编辑  收藏  举报