队列是一种有序列表,可用数组或链表来实现
队列的特点:先进先出
应用场景:银行排队叫号场景
队尾:rear,指向队列尾的数据(即包含队列的最后一个数据)
对头:front,指向队列的前一个位置
队列的最大容量:maxSize
出队时front发生改变,入队时rear发生改变
判断队列是否为空:rear==front
判断队列是否为满:rear==maxSize-1
代码实现:
@Test public void arrayQueue() { //创建一个队列 ArrayQueue queue= new ArrayQueue(3); char key=' ';//接受用户输入 Scanner scanner=new Scanner(System.in); boolean loop=true; //输出一个菜单 while(loop){ System.out.println("s(show):显示队列"); System.out.println("s(exit):退出程序"); System.out.println("a(add):添加数据队列"); System.out.println("g(get):取出队列数据"); System.out.println("h(head):查看队列头"); 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\n",res); }catch(Exception e){ System.out.println(e.getMessage()); } break; case'h'://查看队列头的数据 try{ int res=queue.getQueue(); System.out.printf("队列头的数据是",res); }catch(Exception e){ System.out.println(e.getMessage()); } break; case'e'://退出 scanner.close(); loop=false; break; default: break; } System.out.println("程序退出"); } } //使用数组模拟队列编写一个ArrayQueue类 class ArrayQueue { private int maxSize;//表示数组的最大容量 private int front;//队列头 private int rear;//队列尾 private int[] arr;//该数组用于存放数据,模拟队列 //创建队列的构造器 public ArrayQueue(int arrMaxSize) { maxSize = arrMaxSize; arr = new int[maxSize]; front = -1;//指向队列头部,分析出front是指向队列头的前一个位置 rear = -1;//指向队列尾,指向队列尾的数据(即就是队列最后一个数据) } //判断队列是否满 public boolean isFull() { return rear==maxSize-1; } //判断队列是否为空 public boolean isEmpty(){ return rear==front; } //添加数列到队列 public void addQueue(int n){ //判断队列是否满 if(isFull()){ System.out.println("队列满,不能加入数据"); return; } rear++;//让rear后移 arr[rear]=n; } //出队列 public int getQueue(){ //判断队列是否为空,会报数组越界 if(isEmpty()){ //通过抛出异常来处理 throw new RuntimeException("队列空,不能取数据"); } front++; return arr[front]; } //显示队列的所有数据 public void showQueue(){ //遍历 if(isEmpty()){ System.out.println("队列为空,没有数据"); return; } for(int i=0;i<arr.length;i++){ System.out.println(arr[i]); } } //显示队列的头数据,注意不是取出数据 public int headQueue(){ //判断 if(isEmpty()){ System.out.println("队列为空,没有数据"); } return arr[front+1]; } }
但是这种实现方式会出现假溢出的现象,造成资源的浪费,只能使用一次。为了解决这个问题,采用循环队列的实现方式。