队列

来源:互联网 发布:在线监测数据造假刑法 编辑:程序博客网 时间:2024/06/05 13:38

一、队列概述

队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。

队列特点:先进先出(FIFO)

队列的结构:
这里写图片描述

二、Java实现顺序循环队列

引入两个指针,front指向队头,rear指向队尾元素的下一个位置,front等于rear时,是空队列。

这里写图片描述

a1,a2出列,再入队a5

这里写图片描述

这时,rear会移动到数组之外,如果再入队一个元素,就会产生数组越界的错误,但是数组下标为0和1的地方还是空闲的。这种现象叫做“假溢出”。我们可以让rear指向下标为0的位置,这样就可以解决rear指针的问题。

这里写图片描述

然后入队a6,将它放置于下标为0处,rear指向1,再入队a7,rear和front重合

这里写图片描述

那么,当front==rear是,我们如何判断此时的队列究竟是空还是满呢?我们可以让数组有一个空闲单元时就认为此时队列已满。

这里写图片描述

设队列大小为n,那么队列满的条件是(rear+1)%n==front,计算队列长度的公式为(rear-front+n)%n
右边队列(1+1)%5=2,取零余2。(1-2+5)%5=4,长度为4。

public class Queue {    private Object array[];    private int front, rear, size;    private int maxsize;    // 初始化一个长度为10的数组    public Queue() {        array = new Object[10];        front = rear = size = 0;        maxsize = 10;    }    public boolean isEmpty() {        if ((size == 0) && (rear == front))            return true;        else            return false;    }    public int size() {        return size;    }    // 入队    public void EnQueue(Object o) {        if (((rear + 1) % maxsize == front))            expand();        array[rear] = o;        rear = (rear + 1) % maxsize;        size++;    }    // 出队    public Object DeQueue() {        Object obj = null;        if (size == 0) {            System.out.println("队列为空");        } else {            Object o = array[front];            front = (front + 1) % maxsize;            size--;            obj = o;        }        return obj;    }    // 队首元素    public Object front() {        if (size == 0)            System.out.println("队列为空");        return array[front];    }    private void expand() {        Object newArray[] = new Object[maxsize * 2];        for (int i = 0; i < size; i++) {            newArray[i] = array[(front + i) % maxsize];        }        array = newArray;        front = 0;        rear = size;        maxsize = maxsize * 2;    }    public void clear() {        for (int i = 0; i < maxsize; i++) {            array[i] = null;        }        front = rear = size = 0;    }    public void show() {        String str = "";        for (int i = 0; i < size; i++) {            str = str + array[(front + i) % maxsize];            str = str + " ";        }        System.out.println(str);    }}

三、Java实现链式队列

这里写图片描述

public class Node {    public Object data;    public Node next;    public Node() {        this(null);    }    public Node(Object data) {        this.data = data;        this.next = null;    }}
public class LinkQueue {    private Node front, rear;    private int size;    public LinkQueue() {        front = rear = new Node();        size = 0;    }    public boolean isEmpty() {        if (size == 0)            return true;        else            return false;    }    public int size() {        return size;    }    public void EnQueue(Object o) {        Node p = new Node(o);        rear.next = p;        rear = p;        size++;    }    public Object DeQueue() {        Node p = front.next;        front.next = p.next;        size--;        return p.data;    }    public Object head() {        return front.next.data;    }    public void clear() {        front.next = null;        rear = front;        size = 0;    }    public void show() {        StringBuilder sb = new StringBuilder();        Node p = front;        while ((p = p.next) != null) {            sb.append(p.data);            sb.append(" ");        }        System.out.println(sb);    }}
0 0
原创粉丝点击