Use Array To Implement Queue With Size(bounded)

 1 /*
 2 note, here we use the concept of circle array: so head and tail could be in the middle of it.
 3 head index is the 1st real value; tail index is the 1st available slot
 4     h       t
 5 [...1 2 3 4 ....]
 6 head: the first added value, the 1st index of meaningful value.
 7 tail: points to the first available position to add new element
 8 size: # of elements in array
 9 when offer new element:
10 1) use the tail index
11 2) tail++. tricky: if tail++ == array.length: means the array is full(index out of bound), then move tail to 0
12 3) size++
13 
14 when pop element:
15 1) return the head value
16 2) head++ tricky: if head++ == array.length(index out of bound) then move head to 0
17 3) tail--
18 4) size--
19 * */
20 public class UseArrayImplementQueueWithSize {
21     private int headIndex ;
22     private int tailIndex ;
23     private int size; //number of real value in array
24     private int[] array ; //the underlying buffer
25 
26     public UseArrayImplementQueueWithSize(int cap) {
27         array = new int[cap] ;
28         headIndex = 0;
29         tailIndex = 0 ;
30         size = 0 ;
31     }
32 
33     //add to the tailIndex
34     public boolean offer(int val){
35         //this means array reaches to the limit. adding number will causing losing number
36         if (size == array.length){
37             return false ;
38         }
39         array[tailIndex] = val ;
40         if (tailIndex +1 == array.length){
41             tailIndex = 0 ;
42         } else {
43             tailIndex++ ;
44         }
45         size++;
46         return true ;
47     }
48 
49     //remove from the head, the hole will be filled with garbage value .
50     public Integer poll(){
51         //means there is no real value
52         if (this.size == 0){
53             return null ;
54         }
55         int value = array[headIndex] ;
56         if (headIndex + 1 == array.length){
57             headIndex = 0 ;
58         } else {
59             headIndex ++;
60         }
61         size-- ;
62         return value ;
63     }
64 
65     public Integer peek(){
66         if (this.size == 0){
67             return null ;
68         }
69         return array[headIndex] ;
70     }
71 
72     public boolean isEmpty(){
73         return this.size <= 0 ;
74     }
75 
76     public int getSize(){
77         return this.size ;
78     }
79 
80 
81     public static void main(String[] args) {
82         UseArrayImplementQueueWithSize queue = new UseArrayImplementQueueWithSize(5) ;
83         queue.offer(5);
84         queue.offer(3);
85         System.out.println(queue.size); //2
86         System.out.println(queue.poll()); //5
87         System.out.println(queue.offer(4)); //true
88         System.out.println(queue.poll()); //3
89     }
90 }

原文地址:https://www.cnblogs.com/davidnyc/p/8648492.html