java 实现循环队列的操作。

循环队列

  1. 定义:优化的简单队列,通过取模的形式,可将队列看作是一个循环,这样可以实现数组的复用
  2. 分析
    1. 队空的条件:rear==font
    2. 队满的条件:因为是循环队列,队满的条件有所改变,当满足(rear+1)%maxSize == font,队列未满,小伙伴们可以自行带入数据检验
    3. 分许图
      在这里插入图片描述
    4. 初始条件调整:初始时font便指向队列第一个位置,既font = 0,同时rear = 1
  3. 代码实现
package com.xc.queue;

import java.util.Scanner;

class test{
    public static void main(String[] args) {
        CircleQueue circleQueue = new CircleQueue(4);//实际有效节点为3
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("-------------1-入队--------------");
            System.out.println("-------------2-出队--------------");
            System.out.println("-------------3-队首元素-----------");
            System.out.println("-------------4-显示队列元素--------");
            System.out.println("-------------5-退出---------------");
            System.out.print("请选择您的操作:");
            int choose = scanner.nextInt();
            switch (choose) {
                case 1:
                    System.out.print("请输入一个元素入队:");
                    int data = scanner.nextInt();
                    circleQueue.offer(data);
                    System.out.println("当前队列:");
                    circleQueue.show();
                    break;
                case 2:
                    try {
                        circleQueue.poll();
                        System.out.println("当前队列:");
                        circleQueue.show();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 3:
                    System.out.println("当前队列:");
                    circleQueue.show();
                    break;
                case 4:
                    try {
                        System.out.println(circleQueue.peek());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 5:
                    System.exit(0);
            }
        }
    }
}
public class CircleQueue {
    private int font;
    private int rear;
    private int maxSize;
    private int [] data;
    //初始化队列
    public CircleQueue(int maxSize){
        data = new int[maxSize];
        this.maxSize = maxSize;
        font = 0;
        rear = 0;
    }
    //是否对空
    public boolean isEmpty(){
        if(font == rear){
            return true;
        }
        return false;
    }
    //是否队满
    public boolean isFull(){
        if((rear+1)%maxSize == font){
            return true;
        }
        return false;
    }
    //入队操作
    public void offer(int data){
        if(isFull()){
            System.out.println("队满无法添加数据");
            return ;
        }
        this.data[rear] = data;
        this.rear = (rear+1)%maxSize;//移动队尾
    }
    //出队操作
    public int poll() throws Exception {
        if(isEmpty()){
            System.out.println("队空,出对失败");
            throw new Exception("队列为空");
        }
        int info = this.data[font];
        this.data[font] = 0;
        font = (font+1)%maxSize;
        return info;

    }
    //打印数据
    public void show(){
        if(isEmpty()){
            System.out.println("对列中没有数据");
        }
        for(int i = font;i<font+(rear+maxSize-font)%maxSize;i++){//font+(rear+maxSize-font)%maxSize计算当前循环队列中的节点数
            System.out.println("data"+"["+i+"]"+"="+data[i]);
        }
    }
    //取出队头数据
    public int peek() throws Exception {
        if(isEmpty()){
            throw new Exception("队列中没有数据");
        }
        return this.data[font];
    }
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值