JAVA数据结构与算法-数组模拟环形队列(3)

一、结构

maxSize:初始化队列长度,但可用数据长度为maxSize-1;
front:指向队列头元素位置,默认0。
rear: 指向队列尾元素位置的下一位,默认0。下一位是为了保证队列填满时,尾元素跟着头元素,而不是等于头元素,这也是为什么容量少一。
int[] arr:存放数据的数组。

二、条件

队空:rear == front

队满:(rear+1)%maxSize == front

三、思路及代码实现

package com.clifton.queue;

import java.util.Scanner;

/**
     * 思路
     * 1、头元素位置初始为0,指向头元素当前位置,尾元素初始为0,指向下一个元素要插入的位置
     * 2、队列满 rear+1=front 保证rear始终在front之前一位,从而可以使当rear=front时来确定队列为空,因为是循环队列 所以 (rear+1)%maxsize
     * 3、add arr[rear] = value; rear = (rear + 1) % maxSize;
     * 4、get int tmp = arr[front]; front = (front + 1) % maxSize; return tmp;
     * 5、大小 (rear + maxSize - front) % maxSize;
     * 6、遍历 front -> front+size() {arr[i%maxSize]}
     */
class CircleQueue {

    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;

    // 队列初始化
    public CircleQueue(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
        front = 0;
        rear = 0;
    }

    public boolean isFull() {
        // +1是为了实现队满时,rear紧跟在front之后
        // % maxSize是因为rear可能指向数组最大下标
        return (rear + 1) % maxSize == front;
    }

    public boolean isEmpty() {
        return front == rear;
    }

    // 向队列添加值
    public void addQueue(int value) {
        if (isFull()) {
            System.out.println("队列已满");
            return;
        }
        // 队尾直接赋值
        arr[rear] = value;
        // 因为+1后可能会超过数组下标
        rear = (rear + 1) % maxSize;
    }

    public int getQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        int tmp = arr[front];
        // 因为+1后可能会超过数组下标
        front = (front + 1) % maxSize;
        return tmp;
    }

    // 遍历队列
    public void showQueue() {
        if (isEmpty()) {
            System.out.println("队列为空");
        }
        for (int i = front; i <= front + size() - 1; i++) {
            System.out.println(arr[i%maxSize]);
        }
    }

   	// 得到有效数据个数
    public int size(){
        return (rear+maxSize-front)%maxSize;
    }

    public int headQueue() {
        return arr[front];
    }

}

public class CircleArrayQueueDemo {

    public static void main(String[] args) {

        CircleQueue queue = new CircleQueue(4);

        char key = ' ';

        Scanner scanner = new Scanner(System.in);

        boolean loop = true;

        //模拟测试
        while (loop){
            key = scanner.next().charAt(0);
            switch (key){
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入一个数");
                    int value = scanner.nextInt();
                    queue.addQueue(value);
                    break;
                case 'g':
                    try {
                        int res = queue.getQueue();
                        System.out.println(res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        int head = queue.headQueue();
                        System.out.println(head);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                default:
                    break;
            }
        }

    }


}

你可能感兴趣的:(数据结构与算法)