队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
/** * @Auther: 行路 * @Date: Created on 2020/4/2 19:16 星期四 * @Description: com.csw.queue 使用数组模拟队列 * @version: 1.0 */
public class ArrayQueueDemo { public static void main(String[] args) { //创建一个队列 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("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': 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); }catch (Exception e){ System.out.println(e.getMessage()); } break; case 'h': //出去数据 try{ int res=queue.headQueue(); System.out.printf("队列的头数据是%d",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 isEmpty() { return rear == front; }
//添加数据到队列 public void addQueue(int n) { //判断队列是否慢 if (isFull()) { System.out.println("队列满,不能加入数据~"); return; } 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.printf("arr[%d]=%d\n", i, arr[i]); } }
//显示队列头部数据,不是取出数据
public int headQueue() { //判断 if (isEmpty()) { throw new RuntimeException("队列没有数据");
} return arr[front + 1]; } }
循环队列
package com.csw.queue;
import java.util.Scanner;
/** * @Auther: 行路 * @Date: Created on 2020/4/4 20:07 星期六 * @Description: com.csw.queue * @version: 1.0 */ public class CircleArrayQueueDemo { public static void main(String[] args) { //测试数组模拟环形队列 CircleQueue queue= new CircleQueue(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):查看队列头的数据"); 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); }catch (Exception e){ System.out.println(e.getMessage()); } break; case 'h': //出去数据 try{ int res=queue.headQueue(); System.out.printf("队列的头数据是%d",res); }catch (Exception e){ System.out.println(e.getMessage()); } break; case 'e': //退出 scanner.close(); loop=false; break; default: break; } } System.out.println("程序退出"); } } class CircleQueue{ private int maxSize; //表示数组的最大容量
//front 变量的含义做一个调整:front就指向队列的第一个元素,也就是arr[front] //front 的初始值为=0 private int front; //执行队列头
//rear变量的含义做一个调整,rear指向队列的最后一个元素的后一个位置,因为希望空出一个位置 //rear 的初始值为=0 private int rear; //队列尾 private int[] arr;//该数据用于存放数据,模拟队列
public CircleQueue(int arrMaxSize) { maxSize=arrMaxSize; arr=new int[maxSize]; }
//判断队列是否满 public boolean isFull(){ return (rear+1)%maxSize==front; }
//判断队列是否为空 public boolean isEmpty(){ return rear==front; }
//填加数据 public void addQueue(int n){ //判断队列是否满 if(isFull()){ System.out.println("队列满,不能加入数据~"); return; }