目录
1.场景
在营业厅、银行取号排队,等待业务员叫号进行服务。
2.分析问题
当然是要遵循先来后到的原则,先来的人排号排在前面,先进行服务。
这个时候就可以用到队列的数据结构。
3.队列的基本介绍
-
队列是一个有序列表,可以用数组或者链表来实现。
-
遵循先入先出的原则。
-
使用数组模拟队列的示意图:
MaxSize:表示这个队列能够存放多少数据。
front:队列头,表示第一个数据的前一位的位置。
rear:队列尾,表示最后一个数据的位置。
4.步骤分析
-
在一个队列当中,会有如下几个属性:队列最大存储数量、队列头、队列尾。队列头就是第一条数据的位置-1,队列尾就是最后一条数据的位置。
-
在添加数据的时候要先判断队列是否满了,如果队列头+1等于队列尾则说明队列满了。
-
添加数据时,往队列尾+1的位置存放数据,并将队列尾向后移动一位。
-
在取出数据时,要先判断队列是否为空,如果队列头等于队列尾则说明队列满了。
-
取出数据时,队列头+1的位置取出,并将队列头向后移动一位。
5.代码演示
package com.study.queue;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;
public class ArrayQueueDemo {
public static void main(String[] args) {
//用户输入
Scanner scanner = new Scanner(System.in);
int maxSize = 0;
Boolean isFirstQueue = true;
int haveQueue = 0;
ArrayQueueTest queue = null;
Boolean loop = true;
Scanner sc1 = null;
Scanner sc2 = null;
while (loop){
while (haveQueue==0){
if (isFirstQueue) {System.out.println("请定义队列的长度:");}
try {
sc1 = new Scanner(System.in);
maxSize = sc1.nextInt();
haveQueue = 1;
} catch (Exception e) {
System.out.println("请输入正确的数字:");
}
isFirstQueue = false;
}
while (haveQueue == 1) {
queue = new ArrayQueueTest(maxSize);
haveQueue = 2;
}
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):查看头数据");
char c = scanner.next().charAt(0);
switch (c){
case 's':
queue.showQueue();
break;
case 'e':
loop = false;
System.out.println("程序结束喽,下班~");
break;
case 'a':
Boolean flga = true;
int num = 0;
while (flga){
try {
System.out.println("请输入要插入的数据:");
sc2 = new Scanner(System.in);
num = sc2.nextInt();
queue.addQueue(num);
flga = false;
} catch (Exception e) {
if (e instanceof InputMismatchException){
System.out.print("输入数字格式有误,");
} else {
System.out.println(e.getMessage());
flga = false;
}
}
}
break;
case 'g':
try {
int queue1 = queue.getQueue();
System.out.printf("取出数据是:%d\r\n",queue1);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int i = queue.headQueue();
System.out.printf("头数据是:%d\r\n",i);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
default:
System.out.println("别瞎搞,好好输入,揍你奥!");
break;
}
}
}
}
class ArrayQueueTest {
//1.一个队列会有几个属性 -- 队列的最大长度,队列头=队列中第一条数据的位置-1,队列尾=队列中最后一条数据的位置,初始的数组
private int maxSize;
private int front;
private int rear;
private int[] arrQueue;
//2.一个队列的构造方法
public ArrayQueueTest(int maxSize){
arrQueue = new int[maxSize];
front = -1;
rear = -1;
this.maxSize = maxSize;
}
//4.判断队列是否满了的方法
public Boolean isFull(){
return rear==this.maxSize-1;
}
//3.向队列中添加数据的方法
public void addQueue(int i){
if (isFull()){
throw new RuntimeException("队列满了,别加了~");
}
arrQueue[++rear] = i;
}
//6.判断队列中是否含有数据
public Boolean isEmpty(){
return rear == front;
}
//5.获取队列中数据的方法
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列空的,你取啥?");
}
return arrQueue[++front];
}
//6.查看头数据
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列空的,哪有头?");
}
return arrQueue[front+1];
}
//显示队列中的所有数据
public void showQueue(){
System.out.println("队列中的数据:"+Arrays.toString(arrQueue));
}
}
以上是关于队列的简单小案例,如有不严谨的地方,麻烦各位大佬评论或私信支教,还请不吝赐教,谢谢!