ホームページ >Java >&#&チュートリアル >Javaで循環キューを実装する方法
1. 通常のキューの問題点は何ですか?
キューにはいくつかの重要な属性があることは誰もが知っています:
rear: キューの最後尾、つまり最後の要素の位置を指します。 、初期値は -1
の場合、キューは満杯です。デキューの場合、リアは移動せず、フロント、front == Rear
の場合、キューは空です。完璧に見えますが、実際には問題があります。キュー capacity = 3
の場合、3 つの要素がキューに登録され、front = -1; Rear = 2
となり、この時点で 3 つの要素すべてがデキューされますfront = 2、リア = 2
。この時点では、キューは明らかに空ですが、rear = Capacity - 1
が満たされているため、キューにこれ以上要素を追加することはできません。つまり、キューは 1 回限りであり、再度使用することはできません。使用後は、空であってもキューに追加できず、スペースが無駄になるため、循環キューが表示されます。
リング キューのいくつかの重要な属性:
がある場合、エンキュー操作は次のようになります:
、なぜなら
(rear 1) % Capacity = 1 % 3 !=front
なので、要素をキューに入れることができます。
rear = 1
;
、なぜなら
(rear 1) % Capacity = 2 % 3 !=front
なので、要素をキューに入れることができます。
rear = 2
;
、なぜなら
(後部 1) % 容量 = 3 % 3 == フロント
であるため、要素をキューに追加できず、キューがいっぱいです;
ここでデキュー操作を実行します:
、
リア = 2
、
(リア 1) % 容量 = 3 % 3 = 0 != フロント
。
<code>public class CircleQueue<E> {<br> private int capacity;<br> private int front;<br> private int rear;<br> private Object[] arr;<br><br> public CircleQueue(int capacity){<br> this.capacity = capacity;<br> this.arr = new Object[capacity];<br> this.front = 0;<br> this.rear = 0;<br> }<br><br> public boolean isFull(){<br> return (rear + 1) % capacity == front;<br> }<br><br> public boolean isEmpty(){<br> return rear == front;<br> }<br><br> public void addQueue(E e){<br> if (isFull()){<br> throw new RuntimeException("队列已满,入队失败");<br> }<br> arr[rear] = e;<br> // rear指针后移<br> rear = (rear + 1) % capacity;<br> }<br><br> public E getQueue(){<br> if (isEmpty()){<br> throw new RuntimeException("队列为空,出队失败");<br> }<br> E val = (E) arr[front];<br> front = (front + 1) % capacity;<br> return val;<br> }<br><br><br> public int getSize(){<br> return (rear + capacity - front) % capacity;<br> }<br><br> // 遍历<br> public void showQueue(){<br> if (isEmpty()){<br> return;<br> }<br> for (int i = front; i < front + getSize(); i++) {<br/> System.out.printf("arr[%d]=%d\n", i%capacity, arr[i%capacity]);<br/> }<br/> }<br/><br/> public static void main(String[] args){<br/> CircleQueue<Integer> queue = new CircleQueue<>(3);<br> queue.addQueue(1);<br> queue.addQueue(2);<br> queue.showQueue();<br> //queue.addQueue(3);<br> System.out.println(queue.getSize());<br> System.out.println(queue.getQueue());;<br> queue.addQueue(3);<br> queue.showQueue();<br> }<br>}</code>
以上がJavaで循環キューを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。