数据结构与算法(Java版)_04_环形队列

虽然在数据结构与算法(Java版)_03_队列时已经对队列这种数据结构进行了简单的模拟,

但是这个模拟的小demo还是存在一些问题,就是这种方式模拟的队列只能使用一次

那么如何解决这个问题呢,可以使用环形队列来解决这个问题。

优化方案:

font指向第一个元素;

rear指向最后一个元素的后一个位置 

初始值:

front = 0;

rear = 0;

判断队列满的条件为:(rear + 1) % maxSize == front;

队列添加元素指针rear移动方式:rear = (rear+1) % maxSize;

 

元素出列指针front移动方式:front = (front+1) % maxSize;

 

判断队列为空的条件:rear == front;

队列中有效数据个数:(rear + maxSize - front) % maxSize;

图示分析:

 

代码实现:

package dataStructureAtShangGuiGu;

import java.util.Scanner;

public class CircleQueueDemo {

    public static void main(String[] args) {
        CircleQueueTest queue = new CircleQueueTest(4);
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while(loop) {
            sopInfo();
            char ch = scanner.next().charAt(0);
            switch(ch){
                case 'a':
                    System.out.println("请输入:");
                    queue.add(scanner.nextInt());
                    break;
                case 'g':
                    queue.get();
                    break;
                case 'h':
                    queue.showHead();
                    break;
                case 's':
                    queue.show();
                    break;
                case 'e':
                    loop = false;
                    scanner.close();
                    break;
                    
            }
        }

    }
    private static void sopInfo() {
        System.out.println("--------------------------");
        System.out.println("a(add)添加元素");
        System.out.println("g(get)获取元素");
        System.out.println("h(head)查看第一个元素");
        System.out.println("s(show)查看所有元素");
        System.out.println("e(exit)退出");
        System.out.println("--------------------------");
    }
    
}
class CircleQueueTest{
    private int maxSize; //队列最大容量
    private int front; //队列头指针
    private int rear; //队列尾指针
    private int[] arr; //模拟队列容器
    CircleQueueTest(int maxSize){
        this.maxSize = maxSize;
        this.arr = new int[maxSize];
    }
    private boolean isEmpty() { //判断队列是否空
        return this.front == this.rear;
    }
    private boolean isFull() { //判断队列是否满了
        return this.front == (this.rear+1) % this.maxSize;
    }
    public void add(int num) { //向队列加入元素
        if(this.isFull()) {
            System.err.println("队列已满!");
            return;
        }
        this.arr[this.rear] = num;
        this.rear = (this.rear+1) % this.maxSize;
    }
    public void get() { //获取元素,出队列
        if(this.isEmpty()) {
            System.err.println("队列为空!");
            return;
        }
        int tmp = this.arr[this.front];
        this.front = (this.front+1) % this.maxSize;
        System.out.println(tmp);
    }
    public void show() { //打印队列
        if(this.isEmpty()) {
            System.err.println("队列为空!");
            return;
        }
        for(int i=this.front;i<(front+this.size());i++) {
            System.out.printf("arr[%d]=%d\n",i%this.maxSize,this.arr[i%this.maxSize]);
        }
    }
    public void showHead() {
        if(this.isEmpty()) {
            System.err.println("队列为空!");
            return;
        }
        int tmp = this.arr[this.front];
        System.out.println(tmp);
    }
    private int size() { //获取队列有效元素个数
        return (this.rear+this.maxSize-front) % this.maxSize;
    }
}

运行测试:

先添加元素:

 先取一个元素,然后打印队列看看:

 把元素全取出来,然后添加查看队列:

 结论:环形队列可以无限次使用。

 

posted @ 2021-10-19 19:35  曾经沧海难为水。  阅读(71)  评论(0编辑  收藏  举报