数据结构与算法02 普通队列和环形队列

用数组来表示队列

编写一个ArrayQueue类

内容包括:

构造器,Java代码:

  private int rear=-1;
    private int font=-1;
    private int maxSize;
    private int[] arr;
    //构造器
    public ArrayQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        this.font=font;
        this.rear=rear;
        arr=new int[maxSize];
    }

添加数据

 //添加数据
    public int addQueue(int data){
        //队是否为满?
        if(rear==maxSize-1){
            System.out.println("队满,无法添加~~~");
        }
        rear++;
        arr[rear]=data;
        return  arr[rear];
    }

取出队头元素

 //取出队头数据
    public int getFont(){
        //是否为空
        if(rear==font){
            System.out.println("队列空,无法取出~~");
        }
        font++;
        return arr[font];
    }

展示队列所有元素

    //展示所有数据
    public void showQueue(){
        if(rear==font){
            System.out.println("队空!无法展示!!");
        }
        for(int i=font+1;i<arr.length;i++){//设置为从font+1开始遍历
            System.out.println(arr[i]);
        }
    }

查询队头元素

    //查询队头元素
    public int getHeadData(){
        //是否为空
        if(rear==font){
            System.out.println("队空!!");
        }
        return arr[font+1];
    }

在主函数中调用ArrayQueue类的方法,测试是否正确

利用scanner对象从键盘读入数据,代码:

 public static  void main(String[] args) {
        ArrayQueue q=new ArrayQueue(3);
        System.out.println("=====start test!!=====");
        System.out.println("输入 e 表示退出测试");
        System.out.println("输入 s 显示队列所有元素");
        System.out.println("输入 a 向队列添加元素");
        System.out.println("输入 g 获取队头元素并将其从队列移出");//这里的移除=出指的是font++
        System.out.println("输入 h 查看队头元素");
        char key=' ';
        boolean loop=true;
        while (loop){
            Scanner scanner=new Scanner(System.in);
            key=scanner.next().charAt(0);//键入的第一个数据
            switch (key){
                case 'e':
                System.out.println("退出测试!!!");
                loop=false;
                break;
                case 's':
                    q.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入一个数据:");
                    int value=scanner.nextInt();
                    q.addQueue(value);
                    break;
                case 'g':
                    System.out.println(q.getFont());
                    break;
                case 'h':
                    System.out.println(q.getHeadData());
                    break;
                default:
                    break;
        }
    }
}

汇总代码:

package ArrayQueue;
import java.security.Key;
import java.util.Scanner;
public class Queue {
    public static  void main(String[] args) {
        ArrayQueue q=new ArrayQueue(3);
        System.out.println("=====start test!!=====");
        System.out.println("输入 e 表示退出测试");
        System.out.println("输入 s 显示队列所有元素");
        System.out.println("输入 a 向队列添加元素");
        System.out.println("输入 g 获取队头元素并将其从队列移出");//这里的移除=出指的是font++
        System.out.println("输入 h 查看队头元素");
        char key=' ';
        boolean loop=true;
        while (loop){
            Scanner scanner=new Scanner(System.in);
            key=scanner.next().charAt(0);//键入的第一个数据
            switch (key){
                case 'e':
                System.out.println("退出测试!!!");
                loop=false;
                break;
                case 's':
                    q.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入一个数据:");
                    int value=scanner.nextInt();
                    q.addQueue(value);
                    break;
                case 'g':
                    System.out.println(q.getFont());
                    break;
                case 'h':
                    System.out.println(q.getHeadData());
                    break;
                default:
                    break;
        }
    }
}
}
class ArrayQueue{
    private int rear=-1;
    private int font=-1;
    private int maxSize;
    private int[] arr;
    //构造器
    public ArrayQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        this.font=font;
        this.rear=rear;
        arr=new int[maxSize];
    }
    //添加数据
    public int addQueue(int data){
        //队是否为满?
        if(rear==maxSize-1){
            System.out.println("队满,无法添加~~~");
        }
        rear++;
        arr[rear]=data;
        return  arr[rear];
    }
    //取出队头数据
    public int getFont(){
        //是否为空
        if(rear==font){
            System.out.println("队列空,无法取出~~");
        }
        font++;
        return arr[font];
    }
    //展示所有数据
    public void showQueue(){
        if(rear==font){
            System.out.println("队空!无法展示!!");
        }
        for(int i=font+1;i<arr.length;i++){//设置为从font+1开始遍历
            System.out.println(arr[i]);
        }
    }
    //查询队头元素
    public int getHeadData(){
        //是否为空
        if(rear==font){
            System.out.println("队空!!");
        }
        return arr[font+1];
    }
}

优化队列变成环形队列

优化思路:在普通队列基础上修改其方法,队列变成一个环形,为了便于观察理解我们使得初始时font=0,rear=0,并且当队满时rear指向队列最后一位元素的后一位(队满时rear指向的是空),即下面情况为队满:

 

由图得到队满时条件:(rear+1)%maxSize==font

队空条件仍然是:font==rear

队列中实际元素个数是:(rear-font+maxSize)%maxSize

主函数测试代码不变,只需要修改前文队列类的java代码:

判断队空

  public boolean isempty(){
        if(rear==font){
           // System.out.println("队空!!!");
            return true;
        }
        return false;
    }

判断队满

 public boolean isfull(){
        if((rear+1)%maxSize==font){
            System.out.println("队满!!!");
            return true;
        }
        return false;
    }

添加元素

public void addQueue(int data){
        if(isfull()){
           // System.out.println("队满,无法插入了~~");
            return;
        }
        //注意rear的更新问题
       // rear=(rear+1)%maxSize;
        arr[rear%maxSize]=data;
        rear++;
        System.out.println("插入的值是:"+data);
       // return data;

    }

展示队列所有元素

  //展示队列所有数据
    public void showQueue(){
        if(isempty()){
            System.out.println("队空,无法展示~~");
        }
        //从font,遍历出所有有效的数据
        for(int i=font;i<font+(rear-font+maxSize)%maxSize;i++){
            System.out.println(arr[i%maxSize]);

        }
    }

队头元素出队

 //取出队头元素
    public int getFont(){
        if(isempty()){
            System.out.println("队空,无法取出队头~~");
        }
        //
        int value=arr[font];
        font++;
        return value;
    }

查询队头元素

 //查询队头元素
    public int getHeadData(){
        if(isempty()){
            System.out.println("队空,无法查询队头~~");
        }
        return arr[font];
    }

汇总代码:

package ArrayQueue;
import java.util.Scanner;
public class CircleQueue {
    public static void main(String[] args) {
        circleQueue1 cqueue=new circleQueue1(4);//这里因为约定rear最终指向队列最后一个元素的后一位,所以虽然队列长度是4,但是实际上只有3个位置能存放元素
        System.out.println("=====start test!!=====");
        System.out.println("输入 e 表示退出测试");
        System.out.println("输入 s 显示队列所有元素");
        System.out.println("输入 a 向队列添加元素");
        System.out.println("输入 g 获取队头元素并将其从队列移出");//这里的移除=出指的是font++
        System.out.println("输入 h 查看队头元素");
        char key=' ';
        boolean loop=true;
        while (loop){
            Scanner scanner=new Scanner(System.in);
            key=scanner.next().charAt(0);//键入的第一个数据
            switch (key){
                case 'e':
                    System.out.println("退出测试!!!");
                    loop=false;
                    break;
                case 's':
                    cqueue.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入一个数据:");
                    int value=scanner.nextInt();
                    cqueue.addQueue(value);
                    break;
                case 'g':
                    System.out.println("取出的队头元素是:"+cqueue.getFont());
                    break;
                case 'h':
                    System.out.println(cqueue.getHeadData());
                    break;
                default:
                    break;
            }
        }
    }
}
class circleQueue1{
    private int rear=0;
    private int font=0;
    private int maxSize;
    private int[] arr;
    //构造器
    public circleQueue1(int arrMaxSize){
        maxSize=arrMaxSize;
        this.font=font;
        this.rear=rear;
        arr=new int[maxSize];
    }
    public boolean isempty(){
        if(rear==font){
           // System.out.println("队空!!!");
            return true;
        }
        return false;
    }
    public boolean isfull(){
        if((rear+1)%maxSize==font){
            System.out.println("队满!!!");
            return true;
        }
        return false;
    }

    //增
    public void addQueue(int data){
        if(isfull()){
           // System.out.println("队满,无法插入了~~");
            return;
        }
        //注意rear的更新问题
       // rear=(rear+1)%maxSize;
        arr[rear%maxSize]=data;
        rear++;
        System.out.println("插入的值是:"+data);
       // return data;

    }
    //展示队列所有数据
    public void showQueue(){
        if(isempty()){
            System.out.println("队空,无法展示~~");
        }
        //从font,遍历出所有有效的数据
        for(int i=font;i<font+(rear-font+maxSize)%maxSize;i++){
            System.out.println(arr[i%maxSize]);

        }
    }
    //取出队头元素
    public int getFont(){
        if(isempty()){
            System.out.println("队空,无法取出队头~~");
        }
        //
        int value=arr[font];
        font++;
        return value;
    }
    //查询队头元素
    public int getHeadData(){
        if(isempty()){
            System.out.println("队空,无法查询队头~~");
        }
        return arr[font];
    }
}

每日打卡一道数据结构与算法!!冲刺一百天,我要进大厂!!冲呀!!

=======周末愉快==========

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值