天天看点

数据结构--数组队列数组队列

数组队列

1.1 队列处理方法

定义:队列是一种先进先出(FIFO)的线性表( 先存入队列的数据, 要先取出,后存入的要后取出)。对队列的基本操作有两种: 入队(Enqueue),在表的末端(队尾 tail)插入一个元素;出队(Dequeue),删除或返回在表的开头(队头 head)的元素。

场景:本人不是很喜欢使用递归,递归用以造成死循环,效率低,往往会使用队列代替递归。

1.2 数组模拟队列

数组模拟队列示意图:

数据结构--数组队列数组队列

思路:

  • maxSize :队列容量(数组的长度)
  • arr :模拟队列的数组
  • front :指向队列头部元素的前一个元素,初始值为 -1
  • rear :指向队列尾部元素,初始值为 -1
  • 队列判空:front == rear
  • 队列判满:rear == (maxSize - 1) ,即 rear 是否已经指向了数组的最后一个位置
  • 队列元素个数:rear - front
  • 队列入队:队列不满才能入队,arr[++rear] = value
  • 队列出队:队列不空才能出队,return arr[front++]

代码实现:

public class ArrayQueue {
    private int maxSize;
    private int front = -1;
    private int rear = -1;
    private int[] arr;//模拟队列

    public ArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[arrMaxSize];
        front = -1;//指向队列头部元素的前一个元素,初始值为 -1
        rear = -1;//指向队列尾部元素,初始值为 -1
    }

    /**
     * 判断是否已满
     *
     * @return
     */
    public boolean isFull() {
        return rear == (maxSize - 1);
    }

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

    /**
     * 获得数组元素个数
     *
     * @return
     */
    public int getElementNum() {
        return rear - front;
    }

    /**
     * 入队
     *
     * @param element
     */
    public void addQueue(int element) {
        if (!isFull()) {
            arr[++rear] = element;
        } else {
            System.out.println("队列已满加入失败");
        }
    }

    /**
     * 出队
     *
     * @return
     */
    public int getElement() {
        if (!isEmpty()) {
            front++;
            return arr[front];
        } else {
            System.out.println("队列为空");
            throw new RuntimeException("队列空,不能取数据");
        }
    }

    public void showQueue() {
        // 遍历
        if (isEmpty()) {
            System.out.println("队列空的,没有数据~~");
            return;
        }
        for (int i = front + 1; i <= rear; i++) {
            // Java 中也能用占位符诶
            System.out.printf("数组队列原始列表: arr[%d]=%d\n", i, arr[i]);
        }
    }

    /**
     *  显示队列的头数据, 注意不是取出数据
     * @return
     */
    public int headQueue() {
        // 判断
        if (isEmpty()) {
            throw new RuntimeException("队列空的,没有数据~~");
        }
        return arr[front + 1];
    }

    public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(5);
        queue.addQueue(10);
        queue.addQueue(20);
        queue.addQueue(30);
        queue.addQueue(40);
        int head = queue.headQueue();
        System.out.println("头部元素:" + head);
        int queueElement = queue.getElement();
        System.out.println("获得数据:" + queueElement);
        int queueElement1 = queue.getElement();
        System.out.println("获得数据:" + queueElement1);
        int queueElement2 = queue.getElement();
        System.out.println("获得数据:" + queueElement2);
        queue.showQueue();
    }
}
           
头部元素:10
获得数据:10
获得数据:20
获得数据:30
数组队列原始列表: arr[3]=40
           

继续阅读