四川省建设人才网站,小企业网站建设哪找,百度云怎么做网站,网站建设 考虑1#xff09;队列的定义与实现形式-方式 2#xff09;队列实现思路#xff08;非环形#xff0c;下面进行优化#xff09; 3#xff09;代码实现#xff08;注意并不是环形#xff09;
package DataStructures.queue;import java.util.Scanner;/*** 使用数组模拟队列*…1队列的定义与实现形式-方式 2队列实现思路非环形下面进行优化 3代码实现注意并不是环形
package DataStructures.queue;import java.util.Scanner;/*** 使用数组模拟队列*/
public class ArrayQueueDemo {public static void main(String []args){//测试//创建一个队列ArrayQueue arrayQueue new ArrayQueue(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(a(add):添加数据到队列);System.out.println(g(get):从队列取出数据);System.out.println(h(head):查看队列头的数据);key scanner.next().charAt(0); //接收一个字符System.out.println();switch (key){case s:arrayQueue.showQueue();break;case a:System.out.println(输入一个数);int value scanner.nextInt();arrayQueue.addQueue(value);break;case g: //取数据try {System.out.println(取出的数是 arrayQueue.getQueue());}catch (Exception e){System.out.println(e.getMessage());}break;case h:try{System.out.println(队列头的数据是arrayQueue.headQueue());}catch (Exception e){System.out.println(e.getMessage());}break;case e://退出scanner.close();loop false;break;default:break;}}System.out.println(程序退出~~~~~);}
}//队列类
class ArrayQueue{private int maxSize; //数组的最大容量private int front; //队列头private int rear; //队列尾private int[] arr; //用于存放数据的队列数组//创建队列构造器public ArrayQueue(int arrMaxSize){maxSize arrMaxSize;arr new int[maxSize];front -1; //指向队列头部分析出front指向队列头的前一个位置rear -1; //指向队列尾部指向队列尾的数据即就是队列的最后一个数据}//判断队列是否满public boolean isFull(){return rear maxSize - 1;}//判断队列是否为空public boolean isEmpty(){return rear front;}//添加数据public void addQueue(int n){if (isFull()){System.out.println(队列已满不能加入);return;}rear; //让rear后移arr[rear] n;System.out.println(添加成功);}//获取队列数据出队列public int getQueue(){if (isEmpty()){//通过抛出异常出来throw new RuntimeException(队列为空不能取数据);}front ;return arr[front];}//显示队列的所有数据public void showQueue(){//遍历if (isEmpty()){System.out.println(队列为空);return;}for (int i 0; i maxSize;i){System.out.println(arr[i] arr[i]);}}//显示队列的头数据public int headQueue(){if (isEmpty()){throw new RuntimeException(队列为空);}return arr[front1];}
}
上面代码实现完成后运行会发现添加输入后取出取出的位置不能再进行添加了也就是添加完取出就不能再用了没达到复用的效果
4所以下面进行优化改进成环形数组取模来实现 ps这里最后有效数据个数把他啊想象成一个环形有可能rear在前有可能front在前括号里加一个maxSize是防止rear在front后面形成负数然后取模。
package DataStructures.queue;import java.util.Scanner;/*** 使用数组模拟队列*/public class CircleArrayQueueDemo {public static void main(String []args){//测试//创建一个队列CircleArrayQueue arrayQueue new CircleArrayQueue(4);System.out.println(测试数组模拟环形队列);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(a(add):添加数据到队列);System.out.println(g(get):从队列取出数据);System.out.println(h(head):查看队列头的数据);key scanner.next().charAt(0); //接收一个字符System.out.println();switch (key){case s:arrayQueue.showQueue();break;case a:System.out.println(输入一个数);int value scanner.nextInt();arrayQueue.addQueue(value);break;case g: //取数据try {System.out.println(取出的数是 arrayQueue.getQueue());}catch (Exception e){System.out.println(e.getMessage());}break;case h:try{System.out.println(队列头的数据是arrayQueue.headQueue());}catch (Exception e){System.out.println(e.getMessage());}break;case e://退出scanner.close();loop false;break;default:break;}}System.out.println(程序退出~~~~~);}
}class CircleArrayQueue{private int maxSize; //数组的最大容量//指向队列头部就指向队列的第一个元素// arr[front]就是队列的第一个元素front初值为0private int front;private int rear; //队列尾private int[] arr; //用于存放数据的队列数组//创建队列构造器public CircleArrayQueue(int arrMaxSize){maxSize arrMaxSize; //表示数组最大容量arr new int[maxSize];front 0;rear 0; //指向队列尾部指向队列尾的数据即就是队列的最后一个数据}//判断队列是否满public boolean isFull(){return (rear1)%maxSize front;}//判断队列是否为空public boolean isEmpty(){return rear front;}//添加数据public void addQueue(int n){//是否为空if (isFull()){System.out.println(队列已满不能加入);return;}//直接将数据加入arr[rear] n;//将rear后移这里必须考虑取模rear (rear1) % maxSize;System.out.println(添加成功);}//获取队列数据出队列public int getQueue(){//是否为空if (isEmpty()){//通过抛出异常出来throw new RuntimeException(队列为空不能取数据);}//这里需要分析出front是指向队列的第一个元素// 1.先把front对应的值保存到临时变量// 2.将front 后移// 3.返回临时变量int value arr[front];front (front1) % maxSize;return value;}//显示队列的所有数据public void showQueue(){if (isEmpty()){System.out.println(队列为空);return;}//遍历,从front开始变量遍历多少个元素for (int i front; i front size();i){System.out.println(arr[ i%maxSize ] arr[i%maxSize]);}}//求出当前队列有效数据的个数public int size(){return (rear maxSize - front) % maxSize;}//显示队列的头数据public int headQueue(){if (isEmpty()){throw new RuntimeException(队列为空);}return arr[front];}
}