数组实现循环队列
代码如下:
import java.util.Scanner;
public class CircleQueue {
public static void main(String[] args){
CircleArrQueue arrQueue = new CircleArrQueue(3);
char c;
boolean b = true;
while (b){
System.out.println("请输入字母操作");
System.out.println("a(add),插入数据");
System.out.println("s(show),查看数据");
System.out.println("h(addHead),查看头部数据");
System.out.println("g(get),取出数据");
System.out.println("e(exit),退出");
Scanner in = new Scanner(System.in);
c = in.next().charAt(0);
switch (c){
case 'a':{
int n;
try{
System.out.println("请输入添加的数据:");
n = in.nextInt();
arrQueue.add(n);
System.out.println("添加成功!");
}catch (Exception e){
e.printStackTrace();
}
break;
}
case 'h':{
try{
System.out.println("头部第一个数据为:"+arrQueue.showHead());
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
}
case 's':{
try{
System.out.println("所有数据为:");
arrQueue.showAll();
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
}
case 'g':{
try {
System.out.println("取出的数据为:"+arrQueue.getData());
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
}
case 'e':{
System.out.println("即将退出!!!");
b = false;
}
}
}
}
}
class CircleArrQueue{
//默认为0
private int rear;//队列头
//默认为0
private int front;//队列尾
private int maxSize;//最大数据量
private int[] arr;//存取数据的数组
public CircleArrQueue(int n){
maxSize = n;
arr = new int[maxSize];
}
//判断队列是否满
public boolean isFull(){
return (rear+1)%maxSize == front;
}
//判断队列是否空
public boolean isEmpty(){
return rear == front;
}
//添加数据
public void add(int data){
if(isFull()){
throw new RuntimeException("队列满,无法加入数据。");
}
arr[rear] = data;
rear = (rear+1)%maxSize;//不能直接rear+1,因为是循环队列,可能要从开始处再次存值。
System.out.println("添加成功。");
}
//取数据
public int getData(){
if(isEmpty()){
throw new RuntimeException("队列空,无数据。");
}
int value = arr[front];
front++;
return value;
}
//展示头部数据
public int showHead(){
return arr[front];
}
//展示所有数据
public void showAll(){
if(isEmpty()){
throw new RuntimeException("队列空,无数据。");
}
for(int i = front;i<front+havaManyData();i++){
System.out.printf("arr[%d]=%d\ns" +
"",i%maxSize,arr[i%maxSize]);;
}
}
public int havaManyData(){
return (rear+maxSize-front)%maxSize;
}
}
实现了数组空间的循环使用,为了判断数组是否为空,预留了一个空间。实际可用空间为maxSize-1,接下来开始学习数据结构--链表,继续加油!