队列的操作

106 阅读3分钟

队列的操作

package com.xuda.queue;

/**
 * 队列的操作
 *      入队 addQueue
 *          步骤:添加数据将尾指针后移:rear+ 1,当front == rear时队列为空
 *          若尾指针rear小于队列的最大下标maxSize-1时,则将数据存入rear所指的数组元素中,否则无法存入数据,rear==maxSize -1时,队列满
 *          注意:front指向的是队列首元素的前一个位置
 *      出队
 *      队头
 *      队尾
 */
public class DemoQueue {
    public static void main(String[] args) {
        ArrayQueue arrayQueue = new ArrayQueue(5);
        arrayQueue.addNum(10);
        arrayQueue.addNum(20);
       // System.out.println(arrayQueue.getNum());
        //System.out.println(arrayQueue.isEmpty());
       // arrayQueue.showQueue();
      //  arrayQueue.addNum(30);
        arrayQueue.addNum(40);
        arrayQueue.addNum(50);
      //  System.out.println(arrayQueue.getNum());
        arrayQueue.showQueue();
    }
}
    //创建队列
    class ArrayQueue {
        //队列大小
        int maxSize;

        //用数组来实现队列
        int[] arr;  //存放数据

        //指向队列首元素的前一个位值
        int front;

        //指向队列尾元素
        int rear;

        //构造初始化数据结构
        public ArrayQueue(int maxSize) {
            this.maxSize = maxSize;

            arr = new int[this.maxSize];

            //front指向队列首元素的前一个位置
            front = -1;
            rear = -1;
        }

        //创建方法

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

        /**
         * 判断队列是否为空
         * @return boolean
         */
        public boolean isEmpty() {
            return front == rear;
        }

        public void addNum(int num) {
            if (isFull()) {
                System.out.println("队列已满,无法进行入队操作!");
                return;
            }
            //队尾标记后移,指向要放入的元素的位置
            rear++;
            arr[rear] = num;
        }
        /**
         * 元素出队
         * @return number
         */
        public int getNum() {
            if (isEmpty()) {
                throw new RuntimeException("队列为空,无法出队");
            }
            //队首标记后移,指向队首元素
            System.out.println("出队元素是:");
            front++;
            return arr[front];
        }

        public void showQueue() {
            if (isEmpty()) {
                throw new RuntimeException("队列为空,无法遍历");
            }
            System.out.println("遍历队列");
            for (int start = front + 1; start <= rear; start++) {
                System.out.println(arr[start]);
            }
        }

    }

循环队列操作步骤


package com.xuda.queue;

/**
 * 环形队列的练习
 *         :思路
 *         front变量指向队首元素,初值为0
 *         rear变量指向队列尾元素的下一个元素,初值为0,规定空出一个位置
 *         队列为空的判定条件:front == rear
 *         队列为满的判定条件:(rear + 1)%maxSize == front
 *         队列中有效元素的个数:(rear - front + maxSize) % maxSize
 *         入队和出队时,都需要让标记对maxSize取模
 */
public class circlequeue {
    public static void main(String[] args) {
        Queue queue = new Queue(6);
        queue.addNum(10);
        queue.addNum(20);
        queue.addNum(30);
        queue.addNum(40);
        queue.addNum(50);
        queue.showQueue();
        System.out.println(queue.getNum());
        System.out.println(queue.getNum());
        queue.showQueue();
    }
}
//创建队列
class Queue {
    //队列大小
    int maxSize;

    //用数组来实现队列
    int[] arr;  //存放数据

    //指向队列首元素的前一个位值
    int front;

    //指向队列尾元素
    int rear;

    //构造初始化数据结构
    public Queue(int maxSize) {
        this.maxSize = maxSize;

        arr = new int[this.maxSize];

        //front指向队列首元素的前一个位置
        front = 0;
        rear = 0;
    }

    //创建方法

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

    /**
     * 判断队列是否为空
     *
     * @return boolean
     */
    public boolean isEmpty() {
        return front == rear;
    }
    public void addNum(int num) {
        if (isFull()) {
            System.out.println("队列已经满了,无法操作");
            return;
        }
        //先放入元素,在后移队尾标记
        arr[rear] = num;
        rear = (rear + 1) %maxSize;
    }
    public int getNum() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空无法取出");
        }
        //队首标记后移,指向队首元素
        System.out.println("出队元素是:");
        int num = arr[front];
        front = (front +1) % maxSize;
        return num;
    }
    public void showQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空,无法操作");
        }
        System.out.println("遍历队列");
        int start = front;
        while(start != rear) {
            System.out.println(arr[start]);
            //移动到下一个元素
            start = (start + 1)%maxSize;
        }
    }
    public void getHead() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        System.out.println("队首元素为:" + arr[front]);
    }
}