0077 队列
创始人
2024-03-31 10:30:41
0

 

 

 

  

 

 

import java.util.Scanner;

/*
 * 队列
 * 1.队列是一个有序列表,可以用数组或链表来实现
 * 2.遵循先入先出的原则,即先存入的数据先取出,后存入的数据后取出
 * 
 * 使用数组模拟队列
 * 1.front指向队列头的前一个位置,初始值front=-1
 * 2.rear指向队列尾部数据,初始值rear=-1
 * 3.队列满:rear=maxSize-1
 * 4.队列空:rear=front
 * 缺点:使用一次后就不能使用,不能复用
 *
 * 
 * 使用数组模拟环形队列
 * 1.front指向队列的第一个元素,即arr[front]为队列第一个元素,初始值front=0
 * 2.rear指向队列的最后一个元素的后一个位置,空出一个空间,初始值rear=0
 * 3.队列满:(rear+1)%maxSize==front
 * 4.队列空:rear==front
 * 5.队列中有效的个数 (rear-front+maxSize)%maxSize
 * 
 */
//    使用数组模拟队列
public class Queue_ {
    public static void main(String[] args) {
        //创建队列
        ArrayQueue arrayQueue = new ArrayQueue(3);
        char key = ' ';//接收用户输入
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        //输出菜单
        while (loop) {
            System.out.println("s(show):显示队列");
            System.out.println("a(add):添加数据");
            System.out.println("g(get):取出数据");
            System.out.println("h(head):显示队列头");
            System.out.println("e(exit):退出队列");
            key = scanner.next().charAt(0);
            switch (key) {
            case 's'://显示
                arrayQueue.showQueue();
                break;
            case 'a'://添加
                System.out.println("请输入想要添加的数");
                int value = scanner.nextInt();
                arrayQueue.addQueue(value);
                break;
            case 'g'://取出
                try {
                    int res = arrayQueue.getQueue();
                    System.out.printf("取出了数据%d\n",res);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                break;
            case 'h'://队列头
                try {
                    int res = arrayQueue.headQueue();
                    System.out.printf("队列头数据是%d\n",res);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                break;
            case 'e'://退出
                scanner.close();
                loop = false;
                break;
            default:
                break;
            }
        }
        System.out.println("程序退出");
    }
}

class ArrayQueue{
    private int maxSize;//表示数组最大容量
    private int front;//队列头
    private int rear;//队列尾
    private int[] arr;//存放数据,模拟队列
    
    public ArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = -1;//指向队列头部,front指向队列头的前一个位置
        rear = -1;//指向队列尾部,rear指向队列尾部数据
    }
    
    //判断队列是否满
    public boolean isFull() {
        return rear == maxSize -1;
    }
    
    //判断队列是否空
    public boolean isEmpty() {
        return rear == front;
    }
    
    //添加数据到队列
    public void addQueue(int n) {
        if (isFull()) {
            System.out.println("队列满,无法加入");
            return;
        }
        rear++;//rear后移
        arr[rear] = n;
    }
    
    //取出队列数据(遵循先进先出)
    public int getQueue() {
        if (isEmpty()) {
            //抛出异常
            throw new RuntimeException("队列为空,无法取出");
        }
        front++;//front后移
        return arr[front];
    }
    
    //显示队列所有数据
    public void showQueue() {
        //遍历
        if (isEmpty()) {
            System.out.println("队列为空,没有数据");
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("arr[%d]=%d\n",i,arr[i]);
        }
    }
    
    //显示队列头数据
    public int headQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空,没有头数据");
        }
        return arr[front+1];
    }
    
}

import java.util.Scanner;

//使用数组模拟环形队列
public class Queue02 {
    public static void main(String[] args) {
        //创建队列
        CircleArray arrayQueue = new CircleArray(4);//设置4,有效数据是3,因为预留一个空间
        char key = ' ';//接收用户输入
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        //输出菜单
        while (loop) {
            System.out.println("s(show):显示队列");
            System.out.println("a(add):添加数据");
            System.out.println("g(get):取出数据");
            System.out.println("h(head):显示队列头");
            System.out.println("e(exit):退出队列");
            key = scanner.next().charAt(0);
            switch (key) {
            case 's'://显示
                arrayQueue.showQueue();
                break;
            case 'a'://添加
                System.out.println("请输入想要添加的数");
                int value = scanner.nextInt();
                arrayQueue.addQueue(value);
                break;
            case 'g'://取出
                try {
                    int res = arrayQueue.getQueue();
                    System.out.printf("取出了数据%d\n",res);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                break;
            case 'h'://队列头
                try {
                    int res = arrayQueue.headQueue();
                    System.out.printf("队列头数据是%d\n",res);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                break;
            case 'e'://退出
                scanner.close();
                loop = false;
                break;
            default:
                break;
            }
        }
        System.out.println("程序退出");
    }
}

class CircleArray{
    private int maxSize;//表示数组最大容量
    private int front;//队列头
    private int rear;//队列尾
    private int[] arr;//存放数据,模拟队列
    
    public CircleArray(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = 0;//front指向队列第一个元素
        rear = 0;//rear指向队列的最后一个元素的后一个位置,空出一个空间
        //front与rear默认为0,也可不写
    }
    
    //判断队列是否满
        public boolean isFull() {
            return (rear + 1)% maxSize == front ;
        }
        
    //判断队列是否空
    public boolean isEmpty() {
        return rear == front;
    }
    
    //添加数据到队列
    public void addQueue(int n) {
        if (isFull()) {
            System.out.println("队列满,无法加入");
            return;
        }
        arr[rear] = n;
        //rear后移,考虑取模
        rear = (rear+1) % maxSize;
    }
    
    //取出队列数据(遵循先进先出)
    public int getQueue() {
        if (isEmpty()) {
            //抛出异常
            throw new RuntimeException("队列为空,无法取出");
        }
        //1.先把front对应的值保留到一个临时变量
        int value = arr[front];
        //2.将front后移,考虑取模
        front = (front + 1) % maxSize;
        //3.将临时变量返回
        return value;
    }
    
    //求出当前队列有效数据个数
    public int num() {
        return (rear-front+maxSize)%maxSize;
    }
    
    //显示队列所有数据
    public void showQueue() {
        //遍历
        if (isEmpty()) {
            System.out.println("队列为空,没有数据");
            return;
        }
        //从front开始遍历,队列中有效的个数=(rear-front+maxSize)%maxSize
        for (int i = front; i < front + num(); i++) {
            System.out.printf("arr[%d]=%d\n",i % maxSize,arr[i % maxSize]);
        }
    }
    
    //显示队列头数据
        public int headQueue() {
            if (isEmpty()) {
                throw new RuntimeException("队列为空,没有头数据");
            }
            return arr[front];
        }
}

 

相关内容

热门资讯

新华社快讯:韩国检方对尹锡悦、... 新华社快讯:负责调查韩国前第一夫人金建希案件的特检组29日发布最终调查结果,对包括前总统尹锡悦、金建...
巩固国家通用语言文字法律地位 本报记者 朱宁宁 我国第一部有关语言文字的专门法律——国家通用语言文字法完成首次大修。 2025年1...
甘肃“十五五”规划建议:加快构... 中共甘肃省委关于制定国民经济和社会发展第十五个五年规划的建议发布,其中提到,加快构建 房地产发展新模...
部署六大重点工作 2026年积... 来源:经济参考报 12月27日至28日在京召开的全国财政工作会议为2026年的财政工作划定了重点。会...
权威抚养权律师推荐:家理(深圳... 在抚养权纠纷中,当事人急需专业且靠谱的律师来维护自身权益。那么,资深抚养权律师哪个好,经验丰富的抚养...
四川拓宽法律援助范围 今年办理... “终于胜诉了!要是按以前的规定,我这种情况属于合同纠纷,不符合法律援助申请条件。”近日,来自自贡市的...
汽车早报|零跑汽车发布首款MP... 重庆追加汽车置换、汽车报废更新补贴 据重庆日报,重庆市商务委消息,为贯彻落实国家部委相关要求,扎实...
自贸试验区昆明片区发布一批区域... 12月26日,中国(云南)自贸试验区昆明片区举行制度创新专题新闻发布会,联合昆明综合保税区发布一批改...
原创 存... “钱存银行,50万以内绝对安全”。 这句话你一定听过,但很多人只知其一,不知其二。 2015年《存款...
美银CEO判断:特朗普关税政策... 智通财经获悉,美国银行首席执行官Brian Moynihan表示,尽管2025年的关税措施曾冲击美国...