• 环形队列 数组实现 介绍与实现


    环形队列可以使用数组实现,也可以使用循环链表实现。

    package jiegou;
    
    import jdk.internal.org.objectweb.asm.tree.analysis.Value;
    
    import java.time.temporal.ValueRange;
    import java.util.Scanner;
    
    public class ArrayQueue {
        public static void main(String[] args) {
    
            Queue queue = new Queue(4);
            char key = ' ';// 接受用户输入
            Scanner scanner = new Scanner(System.in);
            boolean loop = true;
    
            while (loop) {
                System.out.println("s(show):显示队列");
                System.out.println("e(exit):退出程序");
                System.out.println("a(add):添加数据到队列");
                System.out.println("g(get):从队列取出数据");
                System.out.println("h(head):查看队列头数据");
                System.out.println("r(rear):查看队列尾数据");
                System.out.println("n(number):查看队列数据大小");
    
                key = scanner.next().charAt(0);// 接受一个字符
                switch (key) {
                    case 's':
                        queue.showQueue();
                        break;
                    case 'a':
                        System.out.println("输入一个数");
                        int value = scanner.nextInt();
                        queue.addQueue(value);
                        break;
                    case 'g':
                        try {
                            int res = queue.getQueue();
                            System.out.printf("取出的数据是%d
    ", res);
                            break;
    
                        } catch (Exception e) {
                            System.out.println(e.getMessage());
                        }
    
                    case 'h':
                        try {
                            int i = queue.headQueue();
                            System.out.printf("队列头的数据是%d
    ", i);
                            break;
                        } catch (Exception e) {
                            System.out.println(e.getMessage());
                        }
    
                    case 'e':
                        scanner.close();
                        loop = false;
                        break;
    
                    case 'r':
                        int rear = queue.rear();
                        System.out.printf("队尾数据%d
    ",rear);
                        break;
                    case 'n':
                        int n = queue.numbers();
                        System.out.printf("有效数据%d
    ",n);
                        break;
                }
            }
    
            System.out.println("程序退出");
        }
    }
    
    
    class Queue {
        private int usedSize; // 数组个数
        private int front; // 队列头
        private int rear; //队列尾巴
        private int[] elem;// 数据
    
        // 构造函数
        public Queue(int n) {
            this.usedSize = 0;
            this.elem = new int[n+1];//数据
            this.front = 0;// 指向队列头部
            this.rear = 0; // 指向队列尾部的下一个
        }
    
        public int numbers()
        {
            System.out.printf("有效数据%d
    ",this.usedSize);
            return this.usedSize;
        }
    
        // 队列是否满了
        public boolean isFull() {
            return (this.rear+1 )%this.elem.length == this.front;
        }
    
        // 队列是否为空
        public boolean isEmpty() {
            return this.rear == this.front;
        }
    
        // 添加数据到队列
        public void addQueue(int value) {
            if (isFull()) {
                System.out.println("队列满了 不能加入数据");
                return;
            }
    
            this.elem[this.rear] = value;
            this.usedSize++;
            this.rear = (this.rear+1)%this.elem.length;
            this.showQueue();
        }
    
        // 出队列
        public int getQueue() {
            if (isEmpty()) {
                System.out.println("队列为空 无数据");
                return -1;
            }
            int value = this.elem[this.front];
            this.front = (this.front+1)%this.elem.length;
            this.usedSize--;
            return value;
        }
    
        // 显示队列数据
        public void showQueue() {
            if (isEmpty()) {
                System.out.println("空队列 无数据");
                return;
            }
            this.headQueue();
            this.numbers();
            for (int i = 0; i < this.elem.length; i++) {
                System.out.printf("arr[%d]=%d
    ", i, this.elem[i]);
            }
        }
    
        // 显示队列头 不取数据
        public int headQueue() {
            if (isEmpty()) {
                //throw new RuntimeException("队列空 没有数据");
                System.out.println("队列为空 无数据");
            }
            // 队里尾部
            //int index = this.rear == 0 ? this.elem.length-1:this.rear-1;
            System.out.printf("队列头索引尾%d
    ",this.front);
            int index = this.rear == 0 ? this.elem.length-1:this.rear-1;
            System.out.printf("队尾索引尾%d
    ",index);
            return this.elem[this.front];
        }
    
        public int rear() {
            if (isEmpty()) {
                //throw new RuntimeException("队列空 没有数据");
                System.out.println("队列为空 无数据");
            }
            // 队里尾部
            int index = this.rear == 0 ? this.elem.length-1:this.rear-1;
            System.out.printf("队尾索引尾%d
    ",index);
            return this.elem[index];
        }
    }
    
    
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    a
    输入一个数
    1
    队列头索引尾0
    队尾索引尾0
    arr[0]=1
    arr[1]=0
    arr[2]=0
    arr[3]=0
    arr[4]=0
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    a
    输入一个数
    2
    队列头索引尾0
    队尾索引尾1
    arr[0]=1
    arr[1]=2
    arr[2]=0
    arr[3]=0
    arr[4]=0
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    a
    输入一个数
    3
    队列头索引尾0
    队尾索引尾2
    arr[0]=1
    arr[1]=2
    arr[2]=3
    arr[3]=0
    arr[4]=0
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    a
    输入一个数
    4
    队列头索引尾0
    队尾索引尾3
    arr[0]=1
    arr[1]=2
    arr[2]=3
    arr[3]=4
    arr[4]=0
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    a
    输入一个数
    5
    队列满了 不能加入数据
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    g
    取出的数据是1
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    a
    输入一个数
    6
    队列头索引尾1
    队尾索引尾4
    arr[0]=1
    arr[1]=2
    arr[2]=3
    arr[3]=4
    arr[4]=6
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    g
    取出的数据是2
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    g
    取出的数据是3
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    g
    取出的数据是4
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    g
    取出的数据是6
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    s
    空队列 无数据
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    a
    输入一个数
    7
    队列头索引尾0
    队尾索引尾0
    arr[0]=7
    arr[1]=2
    arr[2]=3
    arr[3]=4
    arr[4]=6
    s(show):显示队列
    e(exit):退出程序
    a(add):添加数据到队列
    g(get):从队列取出数据
    h(head):查看队列头数据
    r(rear):查看队列尾数据
    n(number):查看队列数据大小
    
    
    
    package www.bittech;
    
    public class MyCircularQueue {
        private int front;//队列头
        private int rear;//队列尾
        private int usedSize;//数据个数
        private int[] elem;//数组
        public MyCircularQueue(int k){
            this.elem=new int[k];
            this.front=0;
            this.rear=0;
            this.usedSize=0;
        }
        public boolean enQueue(int value){
            if(isFull()){
                return false;
            }
            this.elem[this.rear]=value;
            this.usedSize++;
            this.rear=(this.rear+1)%this.elem.length;
            return true;
        }
        //队尾下标加上1在%
        public boolean isFull(){
            if((this.rear+1)%this.elem.length==this.front){
                return true;
            }
            return false;
        }
        public boolean isEmpty(){
            return this.rear==this.front;
        }
        public boolean deQueue(int value){
            if(isEmpty()){
                return false;
            }
            this.elem[front]=value;
            this.front=(this.front+1)%this.elem.length;
            this.usedSize--;
            return true;
        }
        public int Front(){
            if(isEmpty()){
                throw new UnsupportedOperationException("队列为空");
            }
            return this.elem[this.front];
        }
         public int Rear(){
             if(isEmpty()){
                 throw new UnsupportedOperationException("队列为空");
             }
             int index=this.rear == 0 ? this.elem.length-1 : this.rear-1;
             return this.elem[index];
         }
    
    }
    
    
    
  • 相关阅读:
    【IDEA插件】—— 代码量统计工具Statistic
    【Funny Things】001——QQ循环发送消息
    【jmeter测试范例】001——TCP测试
    【Jmeter源码解读】003——TCP采样器代码解析
    【Jmeter源码解读】002——程序入口类NewDriver.java
    Eclipse点击空格总是自动补全代码怎么办,如何自动补全代码,代码提示
    路径中关于斜杠/和反斜杠 的区别
    eclipse查看JDK源码
    Navicat premium如何使用Oracle的OCI
    斐波那契查找不再迷惑
  • 原文地址:https://www.cnblogs.com/brady-wang/p/15140203.html
Copyright © 2020-2023  润新知