ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java数据结构之循环队列(数组实现)

2021-01-09 20:03:44  阅读:175  来源: 互联网

标签:java 队列 System int maxSize println 数据结构 out


package com.ws.队列.数组环形队列;
//环形数组队列
//判断满:尾+1%队列长度==头
//添加数据:要(尾+1)%数组长度
//取出数据:要(头+1)%数组长度               因为这两个都是循环的,相当于一个圆环,%数组长度就是转圈
//队列有效数据个数:(尾+数组长度-头)%数组长度   数组因为是个圈,所以可能出现头>尾的情况,所以要提前转一圈,保证尾>头
//取数据:i%数组长度
//因为到最后一个时判断空是尾+1然后取余,实际数组最后一个空间存不上,所以实际的有效队列长度是maxSize-1
import java.util.Scanner;

public class ArrayQueue {
    public static void main(String[] args) {
        //测试
        Array array=new Array(3);
        char key=' ';//接收用户输入
        Scanner scanner=new Scanner(System.in);
        boolean loop=true;
        while (loop){
            System.out.println("a:显示队列");
            System.out.println("b:退出程序");
            System.out.println("c:添加数据到队列");
            System.out.println("d:从队列取出数据");
            System.out.println("e:显示队列头数据");
            key=scanner.next().charAt(0);//接收一个字符
            switch (key){
                case 'a':
                    array.printqueue();
                    break;
                case 'c':
                    System.out.println("输入一个数");
                    int value=scanner.nextInt();
                    array.addArray(value);
                    break;
                case 'd':
                    try {
                        int get=array.getArray();
                        System.out.println("取出的数据是:"+get);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    try {
                        System.out.println("队列头数据是:"+array.printtou());
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'b':
                    scanner.close();
                    loop=false;
                    break;
                default:
                    break;
            }

        }
        System.out.println("程序退出");

    }
}

//使用数组模拟一个队列
class Array{
    private int maxSize;//数组最大容量
    private int tou;//队列头
    private int wei;//队列尾
    private int arr[];//数组,存数据

    //创建队列构造器
    public Array(int maxSize){
        this.maxSize=maxSize;
        arr=new int[maxSize];
        tou=0;//队列头数据
        wei=0;//队列尾数据
    }

    //判断队列是否满
    public boolean ifMax(){
        return (wei+1)%maxSize==tou;
    }

    //判断队列是否为空
    public boolean ifFull(){
        return tou==wei;
    }

    //添加数据到队列
    public void addArray(int queue){
        //判断队列是否满
        if (ifMax()){
            System.out.println("队列满不能添加数据");
            return;
        }
        //直接将数据加入
        arr[wei]=queue;
        //尾后移,得考虑取模
        wei=(wei+1)%maxSize;
    }

    //出队列
    public int getArray(){
        //判断队列是否为空
        if (ifFull()){
            //抛出异常
            throw new RuntimeException("队列为空!不能取数据");
        }
        //指向队列第一个元素
        int value=arr[tou];
        tou=(tou+1)%maxSize;
        return value;
    }

    //显示队列的所有数据
    public void printqueue(){
        if (ifFull()){
            System.out.println("队列为空,没有数据");
            return;
        }
        //从头开始遍历,遍历有效数据个数
        for (int i=tou;i<tou+size();i++){
            System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
        }
    }

    //求出当前队列有效数据个数
    public int size(){
        return (wei+maxSize-tou)%maxSize;//就是转圈
    }
    //显示队列的头是
    public int printtou(){
        //判断队列空
        if (ifFull()){
            throw new RuntimeException("队列空,无头数据");
        }
        return arr[tou];
    }

}

标签:java,队列,System,int,maxSize,println,数据结构,out
来源: https://blog.csdn.net/wangshuo2020/article/details/112403087

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有