龙空技术网

数据结构与算法-数组模拟环形队列

chadchang头条 106

前言:

眼前各位老铁们对“设计一个算法将一个环形队列的元素倒置”大概比较关心,大家都想要了解一些“设计一个算法将一个环形队列的元素倒置”的相关资讯。那么小编在网摘上汇集了一些有关“设计一个算法将一个环形队列的元素倒置””的相关知识,希望兄弟们能喜欢,各位老铁们一起来学习一下吧!

前题回顾

上一篇数组模拟队列我们发现,我们发现队列无法复用,一次性的,为了解决这个问题,我们改变思路

上篇文章链接: 数据结构与算法-数组模拟队列_chad__chang的博客-CSDN博客

其中涉及到的一些公式,可以验证它,如果你验证也是没问题的,请记住就OK了,需要动动脑子才想的明白。

思路分析

1.把front的含义做一个调整:front指向队列的第一个元素,也就是arr[front ]为第一个元素,front的初始值为0;

2.rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置。希望空成一个空间作为约定,rear的初始值也为0;

3.当队列满时,条件时(rear + 1) % MaxSize = front

4.当队列为空,rear = front

5.队列中有效数据的个数( rear + MaxSize - front ) % MaxSize = 有效个数

代码实现

package com.brilliance.dataStructrues;import java.util.Scanner;public class CircleArrayQueueDemo {    public static void main(String[] args) {        //测试数组模拟环形对列        CircleArray circleArray = new CircleArray(4); //队列的最大数据是3,空一个空间出来        char key = ' ';        Scanner scanner = new Scanner(System.in);        boolean loop = true;        while(loop){            System.out.println("s(show): 显示队列");            System.out.println("e(exit): 退出队列");            System.out.println("g(get): 从队列取出数据");            System.out.println("a(add): 向队列插入数据");            System.out.println("h(head): 显示队列头");            key = scanner.next().charAt(0);            switch (key){                case 's':                    circleArray.showArray();                    break;                case 'a':                    System.out.println("输入一个数字");                    int value = scanner.nextInt();                    circleArray.addQueue(value);                    break;                case 'g':                    try {                        int getValue = circleArray.getQueue();                        System.out.println(getValue);                    } catch (Exception e) {                        System.out.println(e.getMessage());                    }                    break;                case 'h':                    try {                        System.out.println("查看队列头的信息");                        int headValue = circleArray.headQueue();                        System.out.printf("队列头的信息为:%d\n",headValue);                    } catch (Exception e) {                        System.out.println(e.getMessage());                    }                    break;                case 'e':                    scanner.close();                    loop = false;                    break;                default:                    break;            }        }        System.out.println("程序退出");    }}class CircleArray{    private int maxsize;    private int front;    private int rear;    private int[] arr;    public CircleArray(int arrMaxsize){        maxsize = arrMaxsize;        arr = new int[arrMaxsize];        front = 0; //指向队列头部        rear = 0;    }    public boolean isFull(){        return (rear + 1) % maxsize == front;    }    public boolean isEmpty(){        return front == rear;    }    public void addQueue(int n){        if(isFull()){            System.out.println("队列已经满了");            return;        }        arr[rear] = n;        rear = (rear + 1)%maxsize;    }    public int getQueue(){        if(isEmpty()){            throw new RuntimeException("队列已空不能取出数据");        }        int value = arr[front];        front = (front + 1)%maxsize;        return value;    }    public void showArray(){        if(isEmpty()){            System.out.println("队列空,没数据");            return;        }        //从front遍历,遍历到rear就可以        for (int i = front; i < front + size(); i++) {            System.out.printf("arr[%d]=%d\n",i % maxsize,arr[i % maxsize]);        }    }    public int size(){        int value = (rear + maxsize - front)%maxsize;        return value;    }    //显示头元素    public int headQueue(){        if(isEmpty()){            throw new RuntimeException("队列空");        }        return arr[front];    }}

标签: #设计一个算法将一个环形队列的元素倒置 #设计一个算法求环形队列的长度 #设计一个算法将一个环形队列的元素倒置出去