网站开发费会计处理怎么引流客源最好的方法
文章目录
1.队列介绍
- 队列是一个有序列表,可以用数组(顺序存储)或是链表(链式存储)来实现
- 遵循先入先出的原则,即:先存入队列的数据,要先取出,后存入的要后取出
--存在问题,一次性使用,解决方法:变为环形队列
-原数据:-------------------------------------------------------------------------------------
package Queue2;import java.util.Iterator;
import java.util.Scanner;public class ArrayQueueDemo {public static void main(String[] args) {//测试//创建一个队列ArrayQueue queue = 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);//接收一个字符switch (key) {case 's': {queue.showQueue();break;}case 'a': {System.out.println("输出一个数:");int value = scanner.nextInt();queue.addQueue(value);break;}case 'g': {//取出数据try {int res = queue.getQueue();System.out.printf("取出的数据是:%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 'h': {//查看队列头的数据try {int res = queue.headQueue();System.out.printf("队列头的数据是:%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 'e': {//退出scanner.close();//关闭loop=false;break;}default:break;}}System.out.println("程序退出");}}
//使用数组模拟队列-编写一个ArrayQueue类
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;}//判断队列是否为空 //rear=frontpublic boolean isEmpty() {return rear ==front;}//添加数据到队列public void addQueue(int n) {//先判断队列是否满if(isFull()) {System.out.println("不能加入数据");return;}rear++;//让rear后移arr[rear] = n;}//获取队列的数据,出队列,从front开始获取\public int getQueue() {//判断队列是否为空if(isEmpty()) {//通过抛出异常throw new RuntimeException("队列空");}//不为空,取数据front ++;//front后移return arr[front];}//显示队列的所有数据public void showQueue() {//遍历//为空if(isEmpty()) {System.out.println("队列空,没有数据...");return;}//不为空for(int i = 0 ; i < arr.length ;i++) {System.out.printf("arr[%d] = %d\n",i,arr[i]);//[%d]下标}}//显示队列的头数据,注意不是取出数据public int headQueue() {//判断if(isEmpty()) {throw new RuntimeException("队列空,没有数据...");}return arr[front+1];}
}
- 思路:(通过取模方式实现)
- front变量的含义做一个调整,front指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素,front初始值=0
- rear变量的含义做一个调整:rear指向最后一个元素的后一个位置,用来空出一个空间(动态变化)作为约定,rear初始值=0
- 当队列满时,条件改为(rear+1)%maxSize == front
- 当队列为空的条件,rear = front
- 队列中有效数据的个数变为 (rear + maxSize-front) %maxSize. 例如:rear=1 ,front=0
package Queue2;import java.util.Scanner;public class CircleArrayQueue {public static void main(String[] args) {System.out.println("环形队列测试");//测试//创建一个队列CircleArray queue = new CircleArray(4);//说明设置4,其队列的有效数据最大是3char 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);//接收一个字符switch (key) {case 's': {queue.showQueue();break;}case 'a': {System.out.println("输出一个数:");int value = scanner.nextInt();queue.addQueue(value);break;}case 'g': {//取出数据try {int res = queue.getQueue();System.out.printf("取出的数据是:%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 'h': {//查看队列头的数据try {int res = queue.headQueue();System.out.printf("队列头的数据是:%d\n",res);} 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 ;//表示数组的最大容量//front变量的含义做一个调整,front指向队列的第一个元素,//也就是说arr[front]就是队列的第一个元素,front初始值=0private int front;//队列头//rear变量的含义做一个调整:rear指向最后一个元素的后一个位置//,用来空出一个空间(动态变化)作为约定,rear初始值=0private int rear;//队列尾private int[] arr;//该数据用于存放数据,模拟队列public CircleArray(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[maxSize];}//判断队列是否满public boolean isFull() {return (rear+1)%maxSize == front;}//判断队列是否为空 //rear=frontpublic boolean isEmpty() {return rear ==front;}//添加数据到队列public void addQueue(int n) {//先判断队列是否满if(isFull()) {System.out.println("不能加入数据");return;}指向最后一个元素的后一个位置//直接将数据加入arr[rear] = n;//将rear后移,必须考虑取模,向前面移动rear = (rear +1)%maxSize;}//获取队列的数据,出队列,从front开始获取\public int getQueue() {//判断队列是否为空if(isEmpty()) {//通过抛出异常throw new RuntimeException("队列空");}//这里需要分析front是指向队列的第一个元素//1.想把front对应的值保留到一个临时变量//2.将front后移,考虑取模//3.将临时保存的变量返回int value = arr[front];front = (front+1)%maxSize;return value;}//显示队列的所有数据public void showQueue() {//遍历//为空if(isEmpty()) {System.out.println("队列空,没有数据...");return;}//思路:从front开始遍历,遍历多少个元素//理解清楚for(int i = front ; i < front+size() ;i++) {System.out.printf("arr[%d] = %d\n",i%maxSize,arr[i%maxSize]);//[%d]下标}}//求出当前队列的有效个数public int size() {//rear = 2 front = 1 maxSize=3return (rear + maxSize-front) %maxSize;}//显示队列的头数据,注意不是取出数据public int headQueue() {//判断if(isEmpty()) {throw new RuntimeException("队列空,没有数据...");}return arr[front];}
}