队列
有序列表,可以用数组或者链表来实现
特点:先进先出
eg:银行排号
数组模拟队列算法
代码实现
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:显示");
System.out.println("e:退出");
System.out.println("a:添加");
System.out.println("f:展示");
System.out.println("g:取数据");
System.out.println("h:队头");
key = scanner.next().charAt(0);
switch (key){
case 's': {
arrayQueue.findAllQueue();
break;
}
case 'a':
{
System.out.println("请输入一个数");
int value = scanner.nextInt();
arrayQueue.addQueue(value);
break;
}
case 'g':
{
try {
int result = arrayQueue.getQueue();
System.out.println("取出的数据是:"+result);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
}
case 'h':
{
try {
int reslut = arrayQueue.findHeadQueue();
System.out.println("队列的头部元素是:"+reslut);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
}
case 'e':
{
scanner.close();
System.out.println("退出程序");
loop = false;
break;
}
default:
break;
}
}
}
}
//
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;//队列头部前一个位置
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++;
arr[rear] = n;
}
//出队列
public int getQueue(){
if (isEmpty())
{
throw new RuntimeException("队列为空,不能取出数据");
}
return arr[++front];
}
//显示队列所有数据
public void findAllQueue(){
//遍历数据
if (isEmpty())
{
System.out.println("队列为空,没有数据");
return;
}
for (int i =0 ;i<arr.length;i++)
{
System.out.print(arr[i]+"\t");
}
}
//显示队列头数据
public int findHeadQueue(){
//判断是否为空
if (isEmpty())
{
throw new RuntimeException("队列为空,没有数据");
}
return arr[front+1];
}
}
缺点:
我们取出队列,队列是少了一个元素,但是显示还是原来的,刚取出的元素还被显示了(事实上已经取出来了)
我们的队列没有办法实行环形,我们取出结束,不能再加元素了,也就是我们的头指针没有指向最初,不能复用
改进环形队列
取%
front指向我们的第一个元素下标,即arr【front】就是第一个元素
front初始值为0
rear指向队列的最后一个元素的后面的一个位置,空出一个空间做约定
rear初始值为0
队列满时的条件
(rear+1)%maxSize = front
队列为空,
rear = front
队列的有效的数据个数为
(rear + maxSize - front)%maxSize
public class CircleArrayQueueDemo {
public static void main(String[] args) {
CircleArrayQueue circleArrayQueue = new CircleArrayQueue(4);
char key =' ';
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while (loop){
System.out.println("s:显示");
System.out.println("e:退出");
System.out.println("a:添加");
System.out.println("f:展示");
System.out.println("g:取数据");
System.out.println("h:队头");
key = scanner.next().charAt(0);
switch (key){
case 's': {
circleArrayQueue.findAllCircleQueue();
break;
}
case 'a':
{
System.out.println("请输入一个数");
int value = scanner.nextInt();
circleArrayQueue.addCircleQueue(value);
break;
}
case 'g':
{
try {
int result = circleArrayQueue.getCircleQueue();
System.out.println("取出的数据是:"+result);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
}
case 'h':
{
try {
int reslut = circleArrayQueue.findCircleHeadQueue();
System.out.println("队列的头部元素是:"+reslut);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
}
case 'f':
{
System.out.println(circleArrayQueue.size());
break;
}
case 'e':
{
scanner.close();
System.out.println("退出程序");
loop = false;
break;
}
default:
break;
}
}
}
}
class CircleArrayQueue{
private int maxSize;//数组最大容量
private int front;//指向队列头部的标识 初始值为0
private int rear;//指向队列尾部的标识
private int arr[];//保存数据,模拟队列
//创建队列的构造器
public CircleArrayQueue(int arrMaxSize)
{
maxSize = arrMaxSize;
arr = new int[maxSize];
front = 0;
rear = 0 ;
}
//判断是否满
public boolean isFull(){
return (rear + 1)%maxSize == front;
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//添加数据到队列
public void addCircleQueue(int n){
if (isFull())
{
System.out.println("队列已满,不能加入数据");
return;
}
//直接将数据加入
arr[rear] = n;
//rear后移
rear = (rear + 1)%maxSize;
}
//出队列
public int getCircleQueue(){
if (isEmpty())
{
throw new RuntimeException("队列为空,不能取出数据");
}
//front直接指向我们队列第一个元素了
//1.先把front的值保存一下,
//2.front++
//3.将保存的变量返回
int value = arr[front];
front = (front+1)%maxSize;
return value;
}
//求出当前数据有效个数
public int size(){
return (rear + maxSize - front)%maxSize;
}
//显示队列所有数据
public void findAllCircleQueue(){
//遍历数据
if (isEmpty())
{
System.out.println("队列为空,没有数据");
return;
}
//从front开始遍历,不应该是从0开始
//
for (int i =front ;i<front+size();i++)
{
System.out.print(arr[i%maxSize]+"\t");
}
System.out.println("输出完毕");
}
//显示队首
public int findCircleHeadQueue(){
//判断是否为空
if (isEmpty())
{
throw new RuntimeException("队列为空,没有数据");
}
return arr[front];
}
}