java学习之路——环形队列

  • 任务
    主要是在上一篇数组模拟队列的基础上做了修改
    数组模拟队列移步:java学习——数组模拟队列
  1. 修改了两个重要变量front和rear所代表的位置含义
变量 含义
front 指向队列第一个数据
rear 指向队列最后一个数据的后一个位置 (以区别队列空与满)
  1. 要达到循环利用的目的,采用取模的方法:
    队列满:(rear+1)%maxSize=front
    队列空:rear=front
    队列中有效数据个数:(rear-front+maxSize)%maxSize
  • 代码
    环形队列代码仍然包含下列4个功能:
  • 加入数据到队列
  • 从队列中取出数据
  • 显示队列中的数据
  • 显示队列的头数据

如下附上代码:

/*
 *文件名称:CircleQueue.java
 *作者:陈happy
 *完成日期:2020.2.5
 *
 *代码功能:环形队列(出/入队列、显示队列、显示队头)
 */
import java.util.Scanner;
public class CirckeQueue {
	public static void main (String args[]) {
		Queue queue=new Queue(4);
		char key=' ';
		boolean loop=true;
		Scanner t=new Scanner(System.in);
		while(loop) {
			System.out.println("a(addQueue):入队列");
			System.out.println("o(outQueue):出队列");
			System.out.println("s(show):显示队列");
			System.out.println("h(head):显示队头");
			System.out.println("e(exit):退出");
			key=t.next().charAt(0);
			switch(key) {
			case'a':
				System.out.println("请输入要插入的数字");
				int m=t.nextInt();
				queue.addQueue(m);
				break;
			case'o':
				try {
					int data=queue.outQueue();
					System.out.println(data);
				}
				catch(Exception e){
					System.out.println(e.getMessage());
				}
				break;
			case 's':
				try {
				queue.showQueue();
				}
				catch(Exception e){
					System.out.println(e.getMessage());
				}
				break;
			case'h':
				try {
				int ret=queue.showHead();
				System.out.println(ret);
				}
				catch(Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case'e':
				t.close();
				loop=false;
				break;
			default:
				break;
			}
		}
	}

}

//环形队列
class Queue  {
private int maxSize;
private int front;
private int rear;
private int []arr;

//构造队列
public Queue(int n) {
	maxSize=n;
	arr=new int[maxSize];
	front=0;//指向队列的第一个数据
	rear=0;//指向队列最后一个数据的后一个位置,以空出一个空间
}
//判断队列是否满
public boolean isFull() {
	return (rear+1)%maxSize==front;
}
//判断队列是否空
public boolean isEmpty() {
	return rear==front;
}
//数据入队列
public void addQueue(int m) {
	//先判断队列是否满
	if(isFull()) {
		System.out.println("队列已经满啦,不能添加了");
		return;
	}
	else {
		arr[rear]=m;
		rear=(rear+1)%maxSize;
	}
}
//数据出队列
public int outQueue() {
	if(isEmpty()) {
		throw new RuntimeException("队列空,无数据");
	}
	else {
		int value=arr[front];
		front=(front+1)%maxSize;
		return value;
	}
}
//显示队列所有数据
public void showQueue() {
	if(isEmpty()) {
		throw new RuntimeException("队列空,无数据");
	}
	else {
		for(int i=front;i<front+leng();i++) {
			System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
		}
	}
}

public int leng() {
	return (rear-front+maxSize)%maxSize;
}

//显示队列的头数据
public int showHead() {
	if(isEmpty()) {
		throw new RuntimeException("队列空,无数据");
	}
	else {
		return arr[front];
	}
	}
}

  • 心得与体会
  1. 利用取模达到环形队列的目的,在修改时有很多地方需要注意,在出入队列时rear和front不能单纯的++,而要注意取模;
  2. 遇到困难是多思考,罗列要解决的问题,学会分解问题与解决问题,加油!

你可能感兴趣的:(Java数据结构)