队列(Java实现)

一、队列

1.1 顺序一般队列

1.1.1 概述

这种队列有重大缺陷,不能够充分运用空间,只可作为学习使用。

1.1.2 代码及详细注释

package queue;

import java.util.Scanner;

public class ArrayQueue {
    private int maxSize; // 队列的实际容量大小
    private int front; // 第1个元素所在位置的前1个位置的索引
    private int rear; // 最后1个元素所在位置的索引
    private int[] queue; // 队列本身

    /**
     * 构造队列的方法
     * @param logicSize 队列的逻辑大小,就是指用户觉得队列大小为3时,实际需要4个。
     */
    public ArrayQueue(int logicSize){
        maxSize = logicSize + 1;
        queue = new int[maxSize];
    }

    /**
     * 判断队列是否已满
     * @return 满为true,不满为false
     */
    public boolean isFull(){
        return rear == maxSize-1;
    }

    /**
     * 判断队列是否为空
     * @return 如果为空,则返回true,否则返回false
     */
    public boolean isEmpty(){
        return front == rear;
    }

    /**
     * 返回队列目前的元素个数
     * @return 队列目前的元素个数
     */
    public int size(){
        return rear - front;
    }

    /**
     * 入队
     * @param n
     * @return 入队成功返回true,否则返回false
     */
    public boolean push(int n){
        // 入队前先检查是否已满
        if(isFull()){
            System.out.println("队满!");
            return false;
        }
        rear++;
        queue[rear] = n;
        return true;
    }

    /**
     * 出队
     * @return 出队的元素
     */
    public int pop(){
        // 出队前先检查是否为空,如果为空抛出异常
        if (isEmpty()){
            throw new RuntimeException("队空!");
        }
        front++;
        return queue[front];
    }

    /**
     * 拿到队首元素
     * @return
     */
    public int front(){
        // 判断是否队空
        if (isEmpty()){
            throw new RuntimeException("队空!");
        }
        return queue[front+1];
    }

    /**
     * 打印队列
     */
    public void showQueue(){
        if(isEmpty()){
            System.out.println("[]");
            return;
        }
        for (int i = front+1; i <= rear; i++) {
            System.out.printf("queue[%d]=%d
",i,queue[i]);
        }
    }


    /**
     * 测试菜单
     * @param args
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入生成队列的大小:");
        int n = sc.nextInt();
        // 去除多余的换行符
        sc.nextLine();
        ArrayQueue arrayQueue = new ArrayQueue(n);

        // 菜单
        loop:
        while (true) {
            System.out.println("1、查看队列元素个数");
            System.out.println("2、入队");
            System.out.println("3、出队");
            System.out.println("4、拿队首元素");
            System.out.println("5、打印队列");
            System.out.println("6、退出");
            System.out.print("请选择:");
            String choice = sc.nextLine();
            switch (choice){
                case "1":
                    int size = arrayQueue.size();
                    System.out.println("size="+size);
                    break;
                case "2":
                    System.out.print("入队元素:");
                    int el = sc.nextInt();
                    // 去除多余的换行符
                    sc.nextLine();
                    arrayQueue.push(el);
                    break;
                case "3":
                    try {
                        int pop = arrayQueue.pop();
                        System.out.println("出队元素:"+pop);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "4":
                    try {
                        int front = arrayQueue.front();
                        System.out.println("队首元素"+front);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "5":
                    arrayQueue.showQueue();
                    break;
                default:
                    break loop;
            }
        }
    }
}

1.2 顺序循环队列

1.2.1 概述

循环队列是一个普遍的队列实现方法,空间利用率比顺序一般队列有较大的提升。

1.2.2 代码及详细注释

package queue;

import java.util.Scanner;

public class ArrayCircleQueue {
    private int maxSize; // 队列的实际容量大小
    private int front; // 第1个元素所在位置的前1个位置的索引
    private int rear; // 最后1个元素所在位置的索引
    private int[] queue; // 队列本身

    /**
     * 构造队列的方法
     * @param logicSize 队列的逻辑大小,就是指用户觉得队列大小为3时,实际需要4个。
     */
    public ArrayCircleQueue(int logicSize){
        maxSize = logicSize + 1;
        queue = new int[maxSize];
    }

    /**
     * 判断队列是否已满
     * @return 满为true,不满为false
     */
    public boolean isFull(){
        return (rear + 1) % maxSize == front;
    }

    /**
     * 判断队列是否为空
     * @return 如果为空,则返回true,否则返回false
     */
    public boolean isEmpty(){
        return front == rear;
    }

    /**
     * 返回队列目前的元素个数
     * @return 队列目前的元素个数
     */
    public int size(){
        return (rear - front + maxSize) % maxSize;
    }

    /**
     * 入队
     * @param n
     * @return 入队成功返回true,否则返回false
     */
    public boolean push(int n){
        // 入队前先检查是否已满
        if(isFull()){
            System.out.println("队满!");
            return false;
        }
        rear = (rear + 1) % maxSize;
        queue[rear] = n;
        return true;
    }

    /**
     * 出队
     * @return 出队的元素
     */
    public int pop(){
        // 出队前先检查是否为空,如果为空抛出异常
        if (isEmpty()){
            throw new RuntimeException("队空!");
        }
        front = (front + 1) % maxSize;
        return queue[front];
    }

    /**
     * 拿到队首元素
     * @return
     */
    public int front(){
        // 判断是否队空
        if (isEmpty()){
            throw new RuntimeException("队空!");
        }
        return queue[(front + 1) % maxSize];
    }


    /**
     * 打印队列
     */
    public void showQueue(){
        if(isEmpty()){
            System.out.println("[]");
            return;
        }
        for (int i = (front+1) % maxSize; i <= front+size(); i++) {
            System.out.printf("queue[%d]=%d
",i % maxSize,queue[i % maxSize]);
        }
    }

    /**
     * 测试菜单
     * @param args
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入生成队列的大小:");
        int n = sc.nextInt();
        // 去除多余的换行符
        sc.nextLine();

        ArrayCircleQueue arrayQueue = new ArrayCircleQueue(n);

        // 菜单
        loop:
        while (true) {
            System.out.println("1、查看队列元素个数");
            System.out.println("2、入队");
            System.out.println("3、出队");
            System.out.println("4、拿队首元素");
            System.out.println("5、打印队列");
            System.out.println("6、退出");
            System.out.print("请选择:");
            String choice = sc.nextLine();
            switch (choice){
                case "1":
                    int size = arrayQueue.size();
                    System.out.println("size="+size);
                    break;
                case "2":
                    System.out.print("入队元素:");
                    int el = sc.nextInt();
                    // 去除多余的换行符
                    sc.nextLine();
                    arrayQueue.push(el);
                    break;
                case "3":
                    try {
                        int pop = arrayQueue.pop();
                        System.out.println("出队元素:"+pop);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "4":
                    try {
                        int front = arrayQueue.front();
                        System.out.println("队首元素"+front);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "5":
                    arrayQueue.showQueue();
                    break;
                default:
                    break loop;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/doubest/p/12818951.html