数组模拟循环队列

.循环队列各个参数的含义

(1)队列初始化时,front和rear值都为零;

(2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;

(3)当队列为空时,front与rear的值相等,但不一定为零;
在这里插入图片描述

假设数组的存数空间为7,此时已经存放1,2,3,4,5,6六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;

解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;

package com.sun.queue;

import java.util.Scanner;

import javax.management.RuntimeErrorException;

public class CircleArrayQueueArray {
	public static void main(String[] args) {
		CircleArrayQueue queue=new CircleArrayQueue(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("g:从队列取出数据");
			System.out.println("h:查看队列头的数据");
			key=scanner.next().charAt(0);//接收一个字符
		switch(key){
		case 's':
			queue.showQueue();break;
		
		case 'a':
			System.out.println("输入一个数");
			int value=scanner.nextInt();
			queue.addQueue(value);
			break;
		
		case 'g':
			try {
				int res=queue.getQueue();
				System.out.println("取出的数据是:"+res);
			} catch (Exception e) {
				// TODO: handle exception
				System.out.println(e.getMessage());
			}
			break;
		case 'h':
		try {
			int res=queue.headQueue();
			System.out.println("队列头的数据为:"+res);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}	
		break;
		case 'e':
			scanner.close();
			loop=false;
			break;
	
		default:break;	
		}
	}
}
}
class CircleArrayQueue{
	private int maxsize;
	private int front;
	private int rear;
	private int[] arr;
	public CircleArrayQueue(int arrsize) {
	maxsize=arrsize;
	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 n){
		if(isFull()){
			System.out.println("队列已满");
			return;
		}
	
		arr[rear]=n;
		rear=(rear+1) % maxsize;
	}
	
	public int getQueue(){
		if(isEmpty()){
			System.out.println("队列已满");
		}
		int value=arr[front];
		front=(front+1) % maxsize;//后移
	return value;
	}
	
	public int size() {
		return (rear+maxsize-front) % maxsize;		
	}
	public void showQueue() {
		if(isEmpty()){
			System.out.println("队列是空的");
			return ;
		}
		for (int i = front; i < front+size(); i++) {
			System.out.printf("arr[%d]=%d\n",i%maxsize,arr[i%maxsize]);
			
		}
	}
	
	public int headQueue(){
		if(isEmpty()){
			throw new RuntimeErrorException(null, "队列为空,没有数据");
		}
		return arr[front+1];
	}
}

发布了58 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40709110/article/details/100560517