数据结构_使用数组模拟环形队列

  1. front 变量的含义做一个调整:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素。
    front的初始值为0;
  2. rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定。rear 的初始值为0;
  3. 当队列满时,条件是(rear + 1)%maxSize == front 此时满。
  4. 当队列为空的条件,rear == front
  5. 当这样分析后,此时队列中有效的数据的个数是 (rear + maxSize - front)%maxSize //rear=1 front=0
  6. 以上我们就可以按照我们的思路对原来的代码进行修改。
import java.util.Scanner;

public class 队列 {
	public static void main(String[] args) {
		System.out.println("测试数组模拟循环队列的案例~~~");
		//创建一个对象
		CircleArray  aq=new CircleArray(4); //设置为4,其队列的有效数据最大是3
		char key = ' ';//用于接收用户数据
		Scanner sc = new Scanner(System.in);
		boolean loop = true;
		//输出一个菜单
		while(loop) {
			System.out.println("s(show):显示队列");
			System.out.println("e(exit):退出队列");
			System.out.println("a(add):添加数据到队列");
			System.out.println("g(get):从队列取出数据");
			System.out.println("h(head):查看队列头的数据");
			key = sc.next().charAt(0);//接去第一个字符
			switch(key) {
			case 's':  //展示队列数据
				aq.showQueue();
				break;
			case 'a': //向队列添加数据
				System.out.println("请输入一个数");
				int value = sc.nextInt();
				aq.addQueue(value);
				break;
			case 'g': //获得队列的数据

				try {
					int res = aq.getQueue();
					System.out.printf("取出的数据实%d\n",res);
					aq.getQueue();
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'h': //查看队列头的数据

				try {
					int res = aq.headQueue();
					System.out.printf("取出的数据实%d\n",res);

				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
			case 'e': //代表要退出
				sc.close();
				loop = false;
				break;
			default:
				break;

			}

		}
		System.out.println("程序退出");
	}


}


//使用数组模拟队列,编写一个ArrayQueue类
class CircleArray{
	private int maxSize;//设置数组的最大容量
	private int front;//队列头
	private int rear;//队列尾部
	private int [] arr;//该数据用于存放数据,模拟队列

	//创建队列的构造器
	public CircleArray(int arrMaxSize) {
		maxSize = arrMaxSize;
		arr = new int [maxSize];
		front  = 0;  //指向队列头部,指向队列头的前一个位置
		rear = 0; //指向队列尾部,队列尾部包含对象最后一个数据,通俗的讲就是队列最后一个位置
	}

	//判断队列是否满
	public boolean isFull() {
		return (rear + 1)%maxSize == front;
	}

	//判断队列是否为空
	public boolean isNull() {
		return rear == front;
	}
	//数据是否添加到队列
	public void addQueue(int n) {
		//判读队列是否满
		if(isFull()) {
			System.out.println("队列满,不能加入数据");
			return;
		}
		//直接添加数据
		arr[rear] = n;
		//将rear后移,此时必须考虑取模
		rear = (rear+1) % maxSize;
	}
	//判读队列的数据,出队列
	public int getQueue() {
		//判读队列是否为空
		if(isNull()) {
			//抛出异常
			throw new RuntimeException("队列为空,不能获取数据");
		}
		//这里需要分析出front是指向队列的第一个元素
		//1.	 此时将front对应的值保留到一个临时变量
		//2.将front后移,考虑取模
		//3.将临时变量保存的变量返回
		int value = arr[front];
		front = (front +1 ) % maxSize;

		return value;

	}

	//显示队列所有数据
	public void showQueue() {
		//将数组数据遍历
		if(isNull()) {
			System.out.println("队列为空,没有数据");
			return;
		}
		//思路:从front 开始遍历,遍历多少个元素

		for(int i = front; i < front+ size(); i++ ) {
			System.out.printf("arr[%d]=%d\n",i % maxSize,arr[i % maxSize]);
		}
	}

	//由于要设置环形队列,此时我们需要求出队列有效数据的个数
	public int size() {
		//rear = 1;
		//front = 0
		//maxSize = 3;
		return (rear + maxSize - front) % maxSize;
	}

	//显示队列的头数据,注意不是取出数据
	public int headQueue() {
		//判断
		if(isNull()) {
			throw new RuntimeException("队列空,没有数据");
		}
		return arr[front];
	}
}

你可能感兴趣的:(算法+面试刷题,数据结构,java,算法)