队列
队列是一个有序列表,可以用数组或链表来实现,遵循先入先出的原则。即先存入队列的数据要先取出,后存入的数据要后取出。
数组实现:
package com.wang;
import java.util.Scanner;
/**
* 使用数组模拟队列
*但是当前数组只能用一次,添加后取出,再次添加的时候加不进去
*/
public class Quene {
public static void main(String[] args) {
ArrQ arrQ = new ArrQ(3);
char key=' ';
Scanner scanner = new Scanner(System.in);
boolean loop=true;
System.out.println("s:显示队列,a:添加数据,g:取出数据,h:显示头数据,e:退出");
while(loop) {
System.out.print("请选择你要进行的操作:");
key=scanner.next().charAt(0);
switch(key) {
case 's':
arrQ.showQ();
break;
case 'a':
System.out.print("请输入要添加的数据:");
int n=scanner.nextInt();
arrQ.addQ(n);
break;
case 'g':
System.out.println(arrQ.getQ());
break;
case 'h':
System.out.println(arrQ.headQ());
break;
case 'e':
scanner.close();
loop=false;
break;
default :
System.out.println("选择错误");
}
}
}
}
class ArrQ{
//数组的最大容量
private int maxsize;
//指向队列头的前一个位置
private int head;
//队列尾:最后一个数据
private int bottom;
//存放数据模拟队列
private int[] arr;
/**
* 对队列进行初始化
* 指定大小
*/
public ArrQ(int maxsize) {
super();
this.maxsize = maxsize;
arr=new int[maxsize];
head = -1;
bottom = -1;
}
/**
* 判断队列是否满了
* 当队尾等于最大容量-1时
*/
public boolean isFull() {
return bottom==maxsize-1;
}
/**
* 判断队列是否为空
* 当队头和队尾相等时
*/
public boolean isEmpty() {
return head == bottom;
}
/**
* 数据入队列
* 先判断是否满
* 队尾后移
*/
public void addQ(int n) {
if (isFull()) {
System.out.println("队列已满");
return;
}
bottom++;
arr[bottom]=n;
}
/**
* 数据出队列,先入先出
* 先判断是否空
* 队头后移
*/
public int getQ() {
if (isEmpty()) {
//抛出异常
throw new RuntimeException("队列为空,不能取数据");
}
head++;
return arr[head];
}
/**
* 显示队列的所有数据
*/
public void showQ() {
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 headQ() {
if (isEmpty()) {
//抛出异常
throw new RuntimeException("队列为空");
}
return arr[head+1];
}
}