Java数据结构与算法-CircleQueue循环队列详解数组模拟代码

Queue循环队列详解以及代码实现

Queue循环队列学习目标

1. 基本介绍
2. 特点和存储方式
3. 比较单向队列
4. 数组模拟队列代码实现
5. 总结重点

一,基本介绍
循环队列可以看成一个环形的数组

二,特点和存储方式
设置一个空的位置当成一个标志,这个位置不存储元素,同时还有maxsize,front,rear属性,队列的最大容量为maxsize-1,起始队列front=rear=0;然后进行存储数据后,rear=(rear+1)%maxsize防止越界,当进行出队列操作时front=(front+1)%maxsize。
用数组模拟图如下:
Java数据结构与算法-CircleQueue循环队列详解数组模拟代码_第1张图片
三,对比单向队列

  1. front和rear的起始值不同,单向都为-1,循环都为0
  2. 判断队满条件不同:单向:rear = maxsize-1;循环为:(rear+1)%maxsize=front
  3. 队头指针和队尾指针的变化不同:单向直接front++,rear++;循环:front=(front+1)%maxsize,rear=(rear+1)%maxsize
  4. 存储:单向容易造成浪费,循环的可以再次使用
  5. 相同点:判断是否为空:front=rear

四,代码实现

package com.atxiaopeng.circlequeue;

import java.util.Scanner;

public class CircleQueue {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print("你想创建一个多长的队列:");
		CreatCirclearr c = new CreatCirclearr(new Scanner(System.in).nextInt()+1);
		//实际输入长度n+1,但是只能存储n个数,最后一位为标志位置。
		System.out.println("队列初始化成功!");
		
		boolean loop = true;
		while (loop) {
			System.out.println("s(show):显示队列");
			System.out.println("a(add):添加数据到队列");
			System.out.println("g(get):从队列取出数据");
			System.out.println("h(head):查看队列头");
			System.out.println("e(exit):退出程序");
			System.out.print("请输入要操作的选项:");
			char key = new Scanner(System.in).next().charAt(0);
			switch (key) {
			case 'a':c.add();
				break;

			case 's':c.show();
			break;
			
			case 'h':c.head();
			break;
			
			case 'g':c.get();
			break;
			
			case 'e':loop = false;
				System.out.print("程序已经退出!");
			break;
			
			default:
				break;
			}
		}
		
	}

}

class CreatCirclearr{
	
	private int Maxsize;
	private int front;
	private int rear;
	int cq [];
	
	public  CreatCirclearr(int max) {
		Maxsize = max;
		cq = new int [max];
		
	}
	
	public boolean isEmpty() {
		return (rear == front);
	}
	
	public boolean isFull() {
		return (rear+1)%Maxsize == front;//rear从零开始的
	}
	
	public void add() {
		if (isFull()) {
			System.out.println("队列已经满了");
		}else {
			System.out.print("请输入进队的数:");
			int a = new Scanner(System.in).nextInt();
			cq[rear] = a;
			System.out.println(a+" 元素进队列成功!");
			rear = (rear+1)%Maxsize;
		}
		
	}
	
	public void get() {
		if (isEmpty()) {
			System.out.println("队列为空!");
		} else {
			System.out.println(cq[front]+" 元素出队列成功!");
			front = (front+1)%Maxsize;
			
		}
	}
	public void head() {
		if (isEmpty()) {
			System.out.println("队列为空!");
		} else {
			System.out.println("队头元素为:"+cq[front]);
		}
	}
	public void show() {
		if (isEmpty()) {
			System.out.println("队列为空!");
		} else {
			System.out.print("队列元素有:");
			for (int i = front; i < front+size();i++) {
				System.out.print(cq[i]+" ");
			}
			System.out.println();
		}
		
	}
	public int  size() {
		return (rear+Maxsize-front)%Maxsize;
	}
	
}

注意:循环遍历的时候,i应该从front的值开始,然后往后循环,有几个元素循环几次,判断条件写成i

如有不妥之处,欢迎指正,相互学习!

你可能感兴趣的:(Java数据结构与算法-CircleQueue循环队列详解数组模拟代码)