zoukankan      html  css  js  c++  java
  • 队列(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;
                }
            }
        }
    }
    
  • 相关阅读:
    python计算文件MD5
    #每日一练 使用迭代器函数和初始种子值构建列表。
    python接收从CMD传过来的值
    ping IP,通与不通执行不同操作
    bat按回车执行命令
    adb执行简单命令,用于刷页面访问次数
    #每日一练 合并字典,并为每个字创建一个列表
    #每日一练 按提供函数,返回差异化
    #每日一练 根据过滤内容,把值分成两组
    #每日一练 根据索引对列表进行排序
  • 原文地址:https://www.cnblogs.com/doubest/p/12818951.html
Copyright © 2011-2022 走看看