1、引入java
2、队列数组
思路分析:上图front指向队列的头部,rear指向队列的尾部。当有数据输入时,队列的头部不懂,尾部向上移,当rear = maxSize - 1 时,队列满,没法再加入数据;当有数据 输出时,队列的尾部不动,头部上移,也就是取出先加入的数据,再取出后加入的数据,当 rear = front 时,队列空,此时没法再取出数据。用数组模拟队列时front 和 rear 均初始 化为-1。 ide
3、代码实现队列添加和取出数据oop
import java.util.Scanner; public class ArrayQueueDemo { public static void main(String[] args) { // 测试一把 //建立一个队列 ArrayQueue arrayQueue = new ArrayQueue(3); 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):查看队列头的数据"); key = scanner.next().charAt(0);//接收一个字符 switch (key) { case 's': arrayQueue.showQueue(); break; case 'a': System.out.println("请输入一个数据:"); int value = scanner.nextInt(); arrayQueue.addQueue(value); break; case 'g': try { int res = arrayQueue.getQueue(); System.out.printf("取出的数据为:%d\n",res); }catch(Exception e) { System.out.println(e.getMessage()); } break; case 'h': try { int res = arrayQueue.headQueue(); System.out.printf("队列头的数据为:%d\n",res); }catch(Exception e) { System.out.println(e.getMessage()); } break; case 'e': scanner.close(); loop = false; System.out.println("程序退出"); break; } } } } //使用数组模拟队列-编写一个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++; //让front后移 return arr[front]; } // 显示队列的全部数据 public void showQueue() { //遍历 if(isEmpty()) { System.out.println("队列空的,没有数据"); return; } for (int i = front+1 ; i < rear + 1; i++) { System.out.printf("arr[%d] = %d\n", i,arr[i]); } } //显示队列的头数据,注意不是取出数据 public int headQueue() { if(isEmpty()) { throw new RuntimeException("队列空的,没有数据"); } return arr[front+1]; } }
4、问题分析及解决测试
用数组模拟队列会存在一个问题:当存入数据,并将数据取出后,发现数组没法再从新存入数据,即数组没法被复用。所以下一篇会讲讲数组当作是环形的,构建一个环形队列,以达到复用的目的。spa