1. Apakah masalah beratur biasa?
Seperti yang kita semua tahu, baris gilir mempunyai beberapa atribut penting:
belakang: menunjuk ke ekor baris gilir, iaitu kedudukan elemen terakhir , dan nilai awal ialah -1
depan: menunjuk ke kedudukan sebelumnya bagi kepala baris gilir, dan nilai awal juga ialah -1
kapasiti: kapasiti barisan
Belakang dan hadapan barisan kosong kedua-duanya sama dengan -1 Apabila memasuki barisan, bahagian hadapan tidak bergerak dan belakang++ . Apabila rear == capacity - 1
, baris gilir penuh; Ia kelihatan sempurna, tetapi sebenarnya ada sesuatu yang tidak kena dengannya. Jika baris gilir front == rear
mempunyai tiga elemen dalam baris gilir, kali ini capacity = 3
, dan kemudian ketiga-tiga elemen dinyah gilir, kali ini front = -1; rear = 2
. Pada masa ini, baris gilir jelas kosong, tetapi tiada lagi elemen boleh ditambah pada baris gilir, kerana ia memenuhi front = 2, rear = 2
, yang bermaksud bahawa baris gilir adalah satu kali dan tidak boleh digunakan lagi Walaupun ia kosong, ia tidak boleh ditambah lagi Beratur, mengakibatkan pembaziran ruang, jadi baris gilir bulat muncul. rear = capacity - 1
2. Idea pelaksanaan baris gilir:
Beberapa atribut penting dalam baris gilir:front == rear
(rear + 1) % capacity == front
(rear + capacity - front) % capacity
rear = (rear + 1) % capacity
front = (front + 1) % capacity;
, operasi enqueue adalah seperti berikut: capacity = 3
, kerana
front = 0
, jadi elemen boleh ditambah pada baris gilir Selepas elemen itu ditambahkan pada pasukan
(rear + 1) % capacity = 1 % 3 != front
;rear = 1
, kerana
front = 0
, jadi elemen boleh ditambah pada baris gilir Selepas elemen itu ditambahkan pada pasukan
(rear + 1) % capacity = 2 % 3 != front
;rear = 2
, kerana
front = 0
, jadi elemen itu tidak boleh ditambah pada baris gilir dan baris gilir penuh; saya bahawa barisan penuh? Ya, algoritma ini untuk menentukan sama ada baris gilir penuh memerlukan pengorbanan ruang dalam tatasusunan. (rear + 1) % capacity = 3 % 3 == front
,
,front = 1
rear = 2
Boleh didapati bahawa apabila sesuatu elemen dinyah gilir, ia memenuhi syarat untuk menyertai baris gilir, jadi ruang tatasusunan boleh digunakan semula. (rear + 1) % capacity = 3 % 3 = 0 != front
<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>
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan baris gilir pekeliling di java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!