数组模拟队列

这篇博客介绍了如何使用数组来实现Java中的队列数据结构。文章详细阐述了队列的先进先出特性,并通过front和rear属性来跟踪队列的前后端。作者提供了ArrayQueue类的实现,包括添加元素、检查队列是否满或空、获取队列首个元素以及显示队列所有元素的方法。此外,还给出了一个ArrayQueueDemo类用于演示队列操作。
摘要由CSDN通过智能技术生成

一:数组形成队列

队列的特点是先进先出,如在银行排队办业务,食堂打饭都是先来先打。

数组实现队列,根据这个,我们需要front和rear属性来记录队列前后端的下标。

1:思路分析

  • 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图 , 其中 MaxS ize  是该队列的最大容量。
  • 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变,如图所示 :
     
     
    当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:思路分析 
    1) 将尾指针往后移:rear+1 , 当 front == rear 【空】 
    2) 若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear 所指的数组元素中,否则无法存入数据。 rear == maxSize - 1[队列满]

     

    2:代码实现

    ArrayQueue实体类
    package com.queue;
    
    /**
     * @author lizhangyu
     * @date 2021/3/8 19:54
     */
    public class ArrayQueue {
    
        private int size;
    
        private int first;
    
        private int rear;
    
        private int[] arr;
    
        public ArrayQueue(int size) {
            this.size = size;
            this.arr = new int[size];
            this.first = -1;
            this.rear = -1;
        }
    
        /**
         * 判断队列是否已经满了
         * @return
         */
        public boolean isFull() {
            return rear == size - 1;
        }
    
        /**
         * 判断队列是否为空
         * @return
         */
        public boolean isEmpty() {
            return rear == first;
        }
    
        public void addQueue(int n) {
            if (isFull()) {
                System.out.println("队列已经满了,不能加入数据了");
                return;
            }
            rear++;
            arr[rear] = n;
        }
    
        /**
         * 获取队列首个数据并出队列
         * @return
         */
        public int getQueue() {
            if (isEmpty()) {
                System.out.println("队列为空");
            }
            first++;
            return arr[first];
        }
    
        /**
         * 获取队列首个数据但是不出队列
         * @return
         */
        public int headQueue() {
            if (isEmpty()) {
                System.out.println("队列为空");
            }
            return arr[first+1];
        }
    
        public void showQueue() {
            if (isEmpty()) {
                System.out.println("队列为空");
                return;
            }
            for (int i = 0; i < arr.length; i++) {
                System.out.println("队列第" + (i + 1) + "个数据为:" + arr[i]);
            }
        }
    }
    
    ArrayQueueDemo实体类
    package com.queue;
    
    import java.util.Scanner;
    
    /**
     * @author lizhangyu
     * @date 2021/3/8 20:09
     */
    public class ArrayQueueDemo {
    
        public static void main(String[] args) {
            ArrayQueue arrayQueue = new ArrayQueue(10);
            String key = "";
            Scanner scanner = new Scanner(System.in);
    
            while (true) {
                System.out.println("show: 显示队列");
                System.out.println("add: 添加数据到队列");
                System.out.println("get: 从队列中取出数据");
                System.out.println("find: 查看队列头的数据");
                System.out.println("exit: 退出系统");
                key = scanner.next();
                switch (key) {
                    case "add" :
                        System.out.println("请输入一个数");
                        int n = scanner.nextInt();
                        arrayQueue.addQueue(n);
                        break;
                    case "find" :
                        int res = arrayQueue.headQueue();
                        System.out.println("从队列中取出数据为:" + res);
                        break;
                    case "get" :
                        res = arrayQueue.getQueue();
                        System.out.println("从队列中取出数据为:" + res);
                        break;
                    case "show" :
                        arrayQueue.showQueue();
                        break;
                    case "exit" :
                        scanner.close();
                        System.exit(0);
                    default:
                        break;
                }
            }
        }
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值