日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

循环队列真的没那么难,就那么几个注意点,附Java代码及运行效果

發布時間:2025/3/19 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循环队列真的没那么难,就那么几个注意点,附Java代码及运行效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 隊列

隊列是一種常見的線性數據結構,滿足先進先出(First In First Out),簡稱為FIFO,第一次看到FIFO還以為是單片機的輸出輸出什么的,見笑了。數據結構不太了解的話可以看看我總結粗略的博客大凌的數據結構。

?

2. 循環隊列

2.1 為什么需要循環隊列

在?大凌的數據結構?中,大凌簡述了隊列可通過數組和鏈表實現,且數組和鏈表各有各的優點。如果我們看中了數組,使用數組實現隊列,那么隨之而來的就需要我們“買單”。我們都知道在Java中,數組是靜態分配的,如果一個數組初始化時大小確定,那么后期是更改不了數組容量的,直至沒有引用指向該內存地址,這個數組地址才會被Java虛擬機回收。但我們為了使隊列滿足先入先出這個規則,那么每一次取出一個元素,只能讓隊列頭指針后移,而不是真正地刪除該內存地址,打字太啰嗦了,直接上圖,如下圖。

通過上圖我們可以了解,使用數組實現隊列時,最終會出現明明隊列的內存空間地址是空的,但是數據無法加入,也就是所謂的“假滿隊列”現象。

因此,為了高效地利用內存資源,“誕生”了循環隊列。

?

2.2 循環隊列的實現

由于循環隊列的特殊,rear和front的更新、隊列是否為空以及隊列是否已滿的判斷條件變得不一樣,接下來就詳細地分析一下循環隊列的實現。

循環隊列的幾點說明

① 循環隊列使用數組實現;

?在初始化隊列容量時,多分配一個,后面有用;

② 隊列頭指針 front 指向第一個元素的前一個元素,指針順時針移動

③ 隊列尾指針 rear 指向最后一個元素,指針順時針移動

?

實現流程

1. 一定要看上面的4點說明再來看實現流程啊啊啊!!!假設構造一個容量為5的隊列,那么多分配一個

? ? 也就是實際生成一個容量為6的數組,初始化 front = 0, rear = 0此時是隊列為空情況,front = rear

? ? 此時實際的數組和循環隊列對應圖如下。

2. 添加兩個元素4和1,front指向第一個元素的前一個元素,rear指向最后一個元素,此時實際的數組和循環隊列對應圖如下。

?

3. 刪除一個元素,也就是取出先進入隊列的元素 4,front還是指向第一個元素的前一個元素,rear還是指向最后一個元素。

? ? 要說明的是,4其實還是在數組的第二個元素那里,只是訪問不到了,則此時實際的數組和循環隊列對應圖如下。

4. 添加四個元素8、3、7、2,front指向第一個元素前一個元素,rear指向最后一個元素注意:因為有一個空間是我們預留的,

? ? 此時已是隊列滿情況,即 (rear + 1) = front;程序中真實判斷隊滿的條件是 (rear + 1) % arr.length == front,后面再講。

? ??有沒有同學好奇rear怎么從數組的后面指向到前面來的呢?添加8 3 7后,rear指向最后一個元素7,rear = 5;

? ? 添加元素2時,程序讓rear繼續自增加1,rear = 6,超出數組的最大索引?其實程序中是?rear = (++rear) % arr.length

? ? 那么在添加元素2后,rear = 0;此時實際的數組和循環隊列對應圖如下。

5. 最后我們再取出元素 1、8、3、7、2,隊空,rear = front;此時實際的數組和循環隊列對應圖如下。

?

?

2.3 循環隊列的實現代碼及運行效果

2.3.1 循環隊列實現類的代碼

class CircleQueue{private int front = 0;private int rear = 0;private int capcity;private int defaultCapcity = 30;String[] arr;CircleQueue(){// 預留了一個位置,所以多分配一個內存空間arr = new String[defaultCapcity + 1];capcity = defaultCapcity + 1;}CircleQueue(int s){// 預留了一個位置,所以多分配一個內存空間arr = new String[s + 1];capcity = s + 1;}void addData(String s){// 隊滿條件if(((rear + 1) % capcity) == front){System.out.println("Queue is full, can't add data");return;}// rear指向的就是最后一個元素,再添加元素需要先后移然后取模rear = (++rear) % capcity;arr[rear] = s;}String getData(){// 隊空條件if(rear == front){System.out.println("Queue is empty, can't get data");return null;}// front指向的是第一個元素的前一個,所以取元素要先后移然后取模front = (++front) % capcity;return arr[front];} }

?

2.3.2 隊列容量為3的運行效果圖

?

總結

以上是生活随笔為你收集整理的循环队列真的没那么难,就那么几个注意点,附Java代码及运行效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。