前言:
眼前各位老铁们对“设计一个算法将一个环形队列的元素倒置”大概比较关心,大家都想要了解一些“设计一个算法将一个环形队列的元素倒置”的相关资讯。那么小编在网摘上汇集了一些有关“设计一个算法将一个环形队列的元素倒置””的相关知识,希望兄弟们能喜欢,各位老铁们一起来学习一下吧!前题回顾
上一篇数组模拟队列我们发现,我们发现队列无法复用,一次性的,为了解决这个问题,我们改变思路
上篇文章链接: 数据结构与算法-数组模拟队列_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]; }}
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #设计一个算法将一个环形队列的元素倒置 #设计一个算法求环形队列的长度 #设计一个算法将一个环形队列的元素倒置出去