ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

环形队列-java实现

2021-11-06 20:02:30  阅读:151  来源: 互联网

标签:java 队列 环形 System int maxSize front rear


其实,环形队列的变化具体就在于front指向了第一个数,而rear指向最后一个数的后一位

,然后环形嘛,就要注意越界问题,所以取模是必不可少的,总的来说还是比较容易

boolean isFull(){
 return (rear+1)%maxSize==front;
}

void add(int n){
arr[rear]=n;
rear=(rear+1)%maxSize;
}

int getFront(){
if(isEmpty()){
throw new RuntimeException("这都能错?")  
 }
int first=front;
front=(front+1)%maxSize;
return arr[first];
}

int getAll(){
if(isEmpty()){
....
 }
for(int i=front;i<fornt+maxSize;i++){
 System.out.print(arr[(i+maxSize)%maxSize]);
 }
}


}

大致就这个意思,在上面打的,可能会有点错误,谢谢

完整代码 

package queue;

import java.util.Scanner;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;

public class CircleArrayQueue {

	public static void main(String[] args) {
      //测试
		System.out.println("测试环形队列()");
		
		//1、创建一个环形队列
		CircleArray array = new CircleArray(4);
		//2.输入一个字符指令
		char input=' ';
		Scanner scanner = new Scanner(System.in);
		//3.设置一个控制循环的变量
		boolean loop=true;
		//4.遍历菜单
		while(loop) {
			System.out.println("(s)显示队列:");
			System.out.println("(e)退出程序:");
			System.out.println("(a)添加数据:");
			System.out.println("(g)取出数据");
			System.out.println("(l)查看头数据");
			//接收用户输入的字符
			input=scanner.next().charAt(0);//发现字符收集需要用charAt()
			switch(input) {
			case's':
				array.show();
				break;
			case'a':
				System.out.println("请输入一个数");
				int n=scanner.nextInt();
				array.addQueue(n);
				break;
			case'g':
				int value = array.getQueue();
				System.out.printf("取出的数据是%d\n",value);
				break;
			case'l':
				int look = array.look();
				System.out.printf("队列的头数据为%d\n",look);
				break;
			case'e'://退出
				scanner.close();//关闭流
				loop=false;//while循环终止
				break;
			}
		}
		//循环退出
		System.out.println("程序退出");
	}

}
class CircleArray{
	private int maxSize;
	private int front;//指向第一个数
	private int rear;//指向最后一个元素的后一个位置
	private int[]arr;//初始化一个数组模拟队列
	
	public CircleArray(int maxSize) {
		this.maxSize=maxSize;
        arr=new int[maxSize];
	}
	
	//是否满
	public boolean isFull() {
		//rear的下一个指向front ,%maxSize防止数组越界
		return (rear+1)%maxSize==front;
	}
	
	public boolean isEmpty() {
		return front==rear;
	}
	
	//添加队列
	public void addQueue(int n) {
		//1.首先判断队列是否为满
		if(isFull()) {
			System.out.println("队列已经满了!不能加入数据");
		}
		//2.直接加入数据
		arr[rear]=n;
		//3.rear需要后移
		rear=(rear+1)%maxSize;//记住不能溢出数组
	}
	
	//获取
	public int getQueue() {
		//1.先判断是否为空
		if(isEmpty()) {
			throw new RuntimeException("队列空,不能取数据");
		}
		//2.然后进行赋值
		int value=arr[front];
		//3.队列后移,将元素取出
		front=(front+1)%maxSize;//front不断后移,%maxSzie保证不越界
		return value;
	}
	
	//队列有效个数
	public int size() {
		return (rear-front+maxSize)%maxSize;//记住越界
	}
	
	//获取队列中所有数据
	public void show() {
		//1.首先判断是否有数据
		if(isEmpty()) {
			System.out.println("队列中啥也没有");
		}
		
		//2.从front开始遍历,因为是环形队列,所以要确保数量size,他是整个都可以遍历的到的,不会浪费资源
		for(int i=front;i<front+size();i++) {
			System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
		}
	}
	
	//看头数据
	public int look() {
		//1.首先判断是否有数据
		if(isEmpty()) {
			System.out.println("队列中无数据");
		}
		return arr[front];
	}
	
}

 

标签:java,队列,环形,System,int,maxSize,front,rear
来源: https://blog.csdn.net/weixin_57128596/article/details/121168010

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有