队列的循环数组实现

队列的循环数组实现

/**
 * 数组模拟环形队列
 * 思路:
 * 1.设置一个变量(front)指向数组队列的第一个元素,并且设置front初始值为0
 * 2.设置一个变量(rear)指向数组队列的最后一个元素的后一位,并且rear初始值为0
 * (保留一个空元素,即队列满时,数组还有一个空闲单元,我们就认定队列已经满了)
 * 3.设置数组的最大容量maxSize,用于判断队列的空与满
 * 4.空的条件:rear==front
 * 5.满的条件:(rear+1)%maxSize==front
 * 6.队列的长度:(rear-front+maxSize)%maxSize
 * @author 
 */

class CircleArray{
 private int maxSize;
 private int front;
 private int rear;
 private int[] arr;  //用于存放数据,模拟队列
 
 public CircleArray(int arrMaxSize){ //创建队列的构造器
  maxSize = arrMaxSize;
  arr = new int[maxSize];
 }
 
 //判断队列是否满
 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;//将rear后移,考虑取模
 }
 
 //获取队列的数据
 public int getQueue(){
  if(isEmpty()){
   throw new RuntimeException("队列空,不能取数据");
  }
  //1.先把front对应的值保留到一个临时变量
  //2.将front后移,考虑取模
  //3.将临时保存的变量返回
  int value =arr[front];
  front=(front+1)%maxSize;  //将front后移,考虑取模
  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 RuntimeException("队列空的,没有数据");
  }
  return arr[front];
 }
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值