用java實現循環隊列的方法:
1、添加一個屬性size用來記錄眼下的元素個數。
目的是當head=rear的時候。通過size=0還是size=數組長度。來區分隊列為空,或者隊列已滿。
2、數組中僅僅存儲數組大小-1個元素,保證rear轉一圈之后不會和head相等。也就是隊列滿的時候。rear+1=head,中間剛好空一個元素。
當rear=head的時候。一定是隊列空了。
隊列(queue)兩端同意操作的類型不一樣:
能夠進行刪除的一端稱為隊頭,這樣的操作也叫出隊dequeue;
能夠進行插入的一端稱為隊尾,這樣的操作也叫入隊enqueue。
隊列的示意圖
實現隊列時,要注意的是假溢出現象。如上圖的最后一幅圖。
如圖所看到的的假溢出現象
解決的方法:使用鏈式存儲,這顯然能夠。在順序存儲時。我們常見的解決的方法是把它首尾相接,構成循環隊列。這能夠充分利用隊列的存儲空間。
循環隊列示意圖:
在上圖中。front指向隊列中第一個元素。rear指向隊列隊尾的下一個位置。
但依舊存在一個問題:當front和rear指向同一個位置時,這代表的是隊空還是隊滿呢?大家能夠想象下這樣的情景。
解決這種問題的常見做法是這種:
使用一標記,用以區分這樣的易混淆的情形。
犧牲一個元素空間。當front和rear相等時,為空。當rear的下一個位置是front時。為滿。
例如以下圖:
以下我們給出循環隊列,并採用另外一種方式,即犧牲一個元素空間來區分隊空和隊滿的代碼.
幾個重點:
1、front指向隊頭。rear指向隊尾的下一個位置。
2、隊為空的推斷:front==rear;隊為滿的推斷:(rear+1)%maxsize==front。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
import java.io.*; public class queuearray { object[] a; //對象數組,隊列最多存儲a.length-1個對象 int front; //隊首下標 int rear; //隊尾下標 public queuearray(){ this ( 10 ); //調用其他構造方法 } public queuearray( int size){ a = new object[size]; front = 0 ; rear = 0 ; } /** * 將一個對象追加到隊列尾部 * @param obj 對象 * @return 隊列滿時返回false,否則返回true */ public boolean enqueue(object obj){ if ((rear+ 1 )%a.length==front){ return false ; } a[rear]=obj; rear = (rear+ 1 )%a.length; return true ; } /** * 隊列頭部的第一個對象出隊 * @return 出隊的對象,隊列空時返回null */ public object dequeue(){ if (rear==front){ return null ; } object obj = a[front]; front = (front+ 1 )%a.length; return obj; } public static void main(string[] args) { queuearray q = new queuearray( 4 ); system.out.println(q.enqueue( "張三" )); system.out.println(q.enqueue( "李斯" )); system.out.println(q.enqueue( "趙五" )); system.out.println(q.enqueue( "王一" )); //無法入隊列,隊列滿 for ( int i= 0 ;i< 4 ;i++){ system.out.println(q.dequeue()); } } } |
以上這篇基于java數組實現循環隊列的兩種方法小結就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/yjbjingcha/p/7239085.html