顺序队列和循环对列
一.基本概念
队列是一个有序列表,可以用数组和链表实现,遵循先入先出的原则
front 队首,指向第一个数据前一位,默认值为-1;
rear 队尾,指向队列最后一个数据,默认值为-1;
maxSize 数组最大长度;
二.顺序队列
入队rear+1;出队front+1;
队列为空:front=rear;
队列满: rear=maxSize-1;
其缺点为无法循环使用;
代码实例:
package com.datestructs;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
queue a=new queue(3);
boolean flag=true;
while(flag) {
Scanner cin=new Scanner(System.in);
System.out.print("a增加元素"+" ");
System.out.print("s输出所有元素"+" ");
System.out.print("r获取数组数据"+" ");
System.out.println("h获取头数据"+" ");
System.out.println("请输入你的选择");
String str=cin.next();
switch(str) {
case "a":
System.out.println("请输入数据");
int c=cin.nextInt();
a.addQueue(c);
break;
case "s":
a.show();
break;
case "r":
int y=a.readQueue();
System.out.println(y);
break;
case "h":
System.out.println(a.hand());
break;
}
System.out.println("是否继续进行操作,继续y,退出n");
String str1=cin.next();
if(str1.equals("y"))
flag=true;
else
//cin.close();
flag=false;
}
}
}
class queue{
private int maxSize;//数组的最大长度
private int real;//队尾,指向队列的最后一个元素
private int front;//队首,指向队列的最前元素的前一位
int[] num;//定义一个数组
public queue(int x) {
this.real=-1;
this.front=-1;
this.maxSize=x;
num=new int[maxSize];
}
//判断队列是否满
public boolean isFull() {
return real==maxSize-1;
}
//判断队列是否空
public boolean isEmpty() {
return real==front;
}
//添加数据到队列,入队
public void addQueue(int x) {
if(isFull()) {
System.out.println("该数组已满");
return;
}
real++;
num[real]=x;
}
//获取队列中的数据,出队
public int readQueue() {
if(isEmpty())
throw new RuntimeException("队列为空");
front++;
return num[front];
}
//显示队列里的所有数据
public void show() {
if(isEmpty())
throw new RuntimeException("队列为空");
for(int i=0;i<num.length;i++) {
System.out.println(num[i]);
}
}
//获取队列头数据
public int hand() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
return num[front+1];
}
}
二.循环队列
front 指向队列第一个元素,默认值为0;
rear 指向队列最后一个元素的下一位,预留了一个空间
队列为空:front=rear
队列已满:(rear+1)%maxSize=front;
队列中有效元素个数: (raea+maxSize-front)%maxSize;
代码实例
package com.datestructs;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
circleQueue a=new circleQueue(5);
Scanner cin=new Scanner(System.in);
boolean flag=true;
while(flag) {
System.out.print("a增加元素"+" ");
System.out.print("s输出所有元素"+" ");
System.out.print("r获取数组数据"+" ");
System.out.println("h获取头数据"+" ");
System.out.println("n退出");
System.out.println("请输入你的选择");
char str=cin.next().charAt(0);
switch(str) {
case 'a':
System.out.println("输入要增加的数");
int b=cin.nextInt();
a.add(b);
break;
case 's':
a.show();
break;
case 'r':
System.out.println(a.read());
break;
case 'h':
System.out.println(a.head());
break;
case 'n':
flag=false;
break;
}
}
System.out.println("已退出");
}
}
class circleQueue{
private int maxSize;
private int front;//队首,默认为0
private int rear;//队尾,指向最后一个元素的下一个位置
private int[] arr;//定义一个数组用来实现环形队列
public circleQueue(int max) {
maxSize=max;
arr=new int[maxSize];
front=0;
rear=0;
}
public boolean isFull() {
return (rear+1)%maxSizefront;
}
public boolean isEmpty() {
return frontrear;
}
//队列中增加一个元素
public void add(int x) {
if(isFull())
System.out.println(“队列已满”);
arr[rear]=x;
rear=(rear+1)%maxSize;
}
//出队
public int read() {
if(isEmpty())
System.out.println(“队列为空”);
int value=front;
front=(front+1)%maxSize;
return arr[value];
}
//输出队列中所有元素
public void show() {
if(isEmpty())
System.out.println(“队列为空”);
for(int i=front;i<front+number();i++) {
System.out.println(arr[i%maxSize]);
}
}
//获取队列的头元素
public int head() {
if(isEmpty())
System.out.println(“队列为空”);
return arr[front];
}
//判断队列中有效元素的个数
public int number() {
return (rear+maxSize-front)%maxSize;
}