zoukankan      html  css  js  c++  java
  • java实现顺序队列

    package queue;
    
    import java.util.Scanner;
    
    public class ArrayQueueLoop
    {
    
        public static void main(String[] args) 
        {
            // TODO Auto-generated method stub
            //测试代码
            //测试数组循化队列
            CircleQueue testQueue=new CircleQueue(4);//设置的是有效的数据,存在有一个空间作为约定
            char key=' ';//接受用户的输入
            Scanner in=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):查看队列头的数据");
                key=in.next().charAt(0);
                switch (key)
                {
                case 's':
                    testQueue.showQueue();
                    break;
                case 'e':
                    in.close();
                    loop=false;
                    break;
                case 'a':
                    System.out.println("请输入要入队的数字:");
                    int add=in.nextInt();
                    testQueue.addQueue(add);
                    break;
                case 'g':
                    try
                    {
                        System.out.printf("出队的元素为:%d\n",testQueue.getQueue());
                    }
                    catch (Exception e) {
                        // TODO: handle exception
                        System.out.println(e.getMessage());
                    }
                    
                    break;
                case 'h':
                    try
                    {
                        System.out.printf("队首元素为:%d\n",testQueue.headQueue());
                    }
                    catch (Exception e) {
                        // TODO: handle exception
                        System.out.println(e.getMessage());
                    }
                    
                    break;
    
                default:
                    break;
                }
                
            }
            System.out.println("退出成功!");
    
        }
    
        
    }
    
    class CircleQueue
    {
        private int maxSize;//数组的最大容量
        private int front;//指向队列的头
        private int rear;//指向队列的尾部
        
        private int[] arr;//该数组用于存放队列,模拟队列
        
        //创建队列的构造器
        public CircleQueue(int arrMaxSize)
        {
            maxSize=arrMaxSize;
            arr=new int[maxSize];
            front=0;//指向队列的头部,初始值为0
            rear=0;//指向队列的尾部的后一个位置,初始值为0
        }
        //判断队列是否满
        public boolean isFull()
        {
            return rear==maxSize-1;
        }
        
        //判断队列是否为空
        public boolean isEmpty()
        {
            return rear==front;
        }
        
        //添加数据到队列
        public void addQueue(int n)
        {
            //判断队列是否满了
            if(isFull())
            {
                System.out.println("队列满,不能加入数据!");
            }
            //直接将数据加入就好了
            arr[rear]=n;
            //将rear后移此处必须取模
            rear=(rear+1)%maxSize;
        }
        
        //获取队列的数组,数据出队列
        public int getQueue()
        {
            //判断队列是不是空了
            if(isEmpty())
            {
                //抛出异常
                throw  new RuntimeException("队列空,不能够取数据!");
            }
            else//不为空
            {
                //这里需要分析出,front是队列第一个元素
                //1.先front的对应的值保存到一个临时的变量
                //2.front后移
                //3.将临时保存的变量返回
                int value=arr[front];
                front=(front+1)%maxSize;
                return value;
            }
        }
        //显示队列所有的数据
        public void showQueue()
        {
            //简单的遍历
            if(isEmpty())
            {
                System.out.println("队列为空,没有数据!");
                return;
            }
            //思路从front开始遍历,遍历时候要遍历多少个元素就可以了
            //要求出当前队列的个数
            for(int i=front;i<(front+getQueueElementNumbers());i++)
            {
                System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);//注意可能会越界,所以要取模
            }
        }
        //返回当前队列有多少元素
        public int getQueueElementNumbers()
        {
            return (rear+maxSize-front)%maxSize;
        }
        
        //显示队列的头数据,注意不是取出数据
        public int headQueue()
        {
            //判断队列已经为空就没有头数据
            if(isEmpty())
            {
                System.out.println("队列空的,没有数据!");
                throw new RuntimeException("队列空的,没有数据!");
            }
            return arr[front];
        }
    }
  • 相关阅读:
    搜索
    c++ map与unordered_map区别及使用
    01BFS
    宇智波程序笔记55-Flutter 混合开发】嵌入原生View-iOS
    宇智波程序笔记54-解Bug之路-记一次线上请求偶尔变慢的排查
    宇智波程序笔记53-从红黑树的本质出发,彻底理解红黑树!
    宇智波程序笔记52-最受欢迎的微服务框架概览
    宇智波程序笔记51-JDK 15安装及新特性介绍
    宇智波程序笔记50-解Bug之路-记一次线上请求偶尔变慢的排查
    宇智波程序笔记49-link JDBC Connector:Flink 与数据库集成最佳实践
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11180811.html
Copyright © 2011-2022 走看看