1 package com.algorithms;
2
3 import java.util.Scanner;
4
5 /**
6 * Created by Administrator on 2019/11/2 0002.
7 */
8 public class CircleQueue {
9 //定义一个数组
10 private int[] arr;
11 //数组的最大值
12 private int maxSize;
13 //头指针
14 private int front;
15 //尾指针
16 private int tail;
17
18 //创建一个带参的构造器,出入队列的大小
19 public CircleQueue(int maxSize){
20 this.maxSize = maxSize;
21 arr = new int[maxSize];
22 }
23
24 //数据测试
25 public static void main(String[] args) {
26 CircleQueue circleQueue = new CircleQueue(5);
27 System.out.println("根据提示输入相关值");
28 Scanner in = new Scanner(System.in);
29 while (true){
30 System.out.println("s:显示");
31 System.out.println("o:输入");
32 System.out.println("p:输出");
33 System.out.println("h:头出");
34 String next = in.next();
35 switch (next){
36 case "s" : circleQueue.list(); break;
37 case "o" :
38 System.out.println("请输入一个数");
39 int i = in.nextInt();
40 circleQueue.offer(i);
41 break;
42 case "p" :
43 int poll = circleQueue.poll();
44 System.out.println(poll);
45 break;
46 case "h" :
47 int peek = circleQueue.peek();
48 System.out.println(peek);
49 break;
50 }
51 }
52 }
53
54 //判断队列是否已满,根据我们的约定来,虽然它还能存放一个元素。
55 //这里面没几个难点。。。这算一个**********************
56 public boolean isFull(){
57 return (tail + 1) % maxSize == front;
58 }
59 //插入方法
60 public void offer(int num){
61 if(isFull()){
62 throw new RuntimeException("队列已满");
63 }
64 arr[tail]=num;
65 //不能直接 ++ 否则可以数据越界
66 //这里面没几个难点。。。这算一个**********************
67 tail = (tail + 1) % maxSize;
68 }
69
70 //判断队列是否为空
71 public boolean isEmpty(){
72 return tail == front;
73 }
74
75 public int poll(){
76 if(isEmpty()){
77 throw new RuntimeException("队列为空");
78 }
79 int temp = arr[front];
80 //不能直接 ++ 否则可以数据越界
81 front = (front + 1) % maxSize;
82 return temp;
83 }
84
85 //查看队列的大小
86 public int size(){
87 //tail+maxSize 是防止队列存满后,tail=2 在 front=3 的前面这种为负数的情况
88 // %maxSize 是防止计算的结果大于 maxSize
89 //这里面没几个难点。。。这算一个**********************
90 return (tail+maxSize-front)%maxSize;
91 }
92
93 //循环查看所有元素信息
94 public void list(){
95 for(int i = front;i< front + size();i++){
96 System.out.printf("arr[%d]==%d\n",i%maxSize,arr[i%maxSize]);
97 }
98 }
99
100 //查看栈顶元素
101 public int peek(){
102 return arr[front];
103 }
104 }