日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

算法專題-手動(dòng)實(shí)現(xiàn)循環(huán)隊(duì)列

 

這次我就使用數(shù)組來(lái)實(shí)現(xiàn)靜態(tài)隊(duì)列了。值得注意的是:往往實(shí)現(xiàn)靜態(tài)隊(duì)列,我們都是做成循環(huán)隊(duì)列。這道題也是我多次面試過(guò)程中遇到的,比如字節(jié)跳動(dòng)和猿輔導(dǎo),希望大家掌握。

為什么靜態(tài)隊(duì)列要做成循環(huán)隊(duì)列呢?試想,底層依賴數(shù)組,如果不做成循環(huán)的,會(huì)非常浪費(fèi)空間,那我們得申請(qǐng)多大的內(nèi)存???既然做成循環(huán)的,首先我們得解決幾個(gè)問(wèn)題,如何判空?如何判滿?最多可以存放多少元素個(gè)數(shù)?

算法專題-手動(dòng)實(shí)現(xiàn)循環(huán)隊(duì)列

 

通過(guò)這幅圖,想必大家很容易理解,下面通過(guò)代碼說(shuō)明。

public class MyQueue {
 public int[] arrays;
 public int front;//指向第一個(gè)有效元素
 public int rear;//指向最后一個(gè)有效元素的下一個(gè)元素(無(wú)效元素)

 public MyQueue(int[] arrays, int front, int rear) {
 this.arrays = arrays;
 this.front = front;
 this.rear = rear;
 }

 /**
 * 判斷隊(duì)列是否滿了
 * @param myQueue
 * @return
 */
 public static boolean isFull(MyQueue myQueue){
 if((myQueue.rear + 1) % myQueue.arrays.length == myQueue.front){
 return true;
 }else{
 return false;
 }
 }

 /**
 * 判斷是否為空
 * @param myQueue
 * @return
 */
 public static boolean isEmpty(MyQueue myQueue){
 if(myQueue.rear == myQueue.front){
 return true;
 }else{
 return false;
 }
 }

 /**
 * 入隊(duì)
 * @param myQueue
 * @param value
 */
 public static void enQueue(MyQueue myQueue, int value){
 //不是滿的隊(duì)列才入隊(duì)
 if(!isFull(myQueue)){
 myQueue.arrays[myQueue.rear] = value;
 myQueue.rear = (myQueue.rear + 1) % myQueue.arrays.length;
 }
 }

 /**
 * 遍歷
 * @param myQueue
 */
 public static void traverse(MyQueue myQueue){
 int i = myQueue.front;
 while(i != myQueue.rear){
 System.out.print(myQueue.arrays[i] + " ");
 i = (i + 1) % myQueue.arrays.length;
 }
 System.out.println();
 }

 public static void outQueue(MyQueue myQueue){
 if(!isEmpty(myQueue)){
 int value = myQueue.arrays[myQueue.front];
 System.out.println(value);
 myQueue.front = (myQueue.front + 1) % myQueue.arrays.length;
 }
 }

 public static void main(String[] args) {
 MyQueue myQueue = new MyQueue(new int[6], 0, 0);
 System.out.println(isEmpty(myQueue));
 enQueue(myQueue, 1);
 enQueue(myQueue, 2);
 enQueue(myQueue, 3);
 enQueue(myQueue, 4);
 enQueue(myQueue, 5);
 System.out.println(isFull(myQueue));
 traverse(myQueue);
 outQueue(myQueue);
 }
}

輸出結(jié)果:

算法專題-手動(dòng)實(shí)現(xiàn)循環(huán)隊(duì)列

 

從上面的設(shè)計(jì)我們可以發(fā)現(xiàn):rear并不指向最后一個(gè)有效的元素,在循環(huán)隊(duì)列中這樣設(shè)計(jì)是非常方便的!因?yàn)檫@樣設(shè)計(jì)可以讓我們分得清隊(duì)頭和隊(duì)尾(不然循環(huán)隊(duì)列不斷入隊(duì)或出隊(duì),位置是變化很快的)

由于我們是循環(huán)隊(duì)列,所以front和rear值會(huì)經(jīng)常變動(dòng),我們得把front和rear的值限定在一個(gè)范圍內(nèi),不然會(huì)超出隊(duì)列的長(zhǎng)度的。

我們通過(guò)這種方式:rear=(rear+1)%數(shù)組長(zhǎng)度

比如rear的下標(biāo)是2,數(shù)組的長(zhǎng)度是6,往后面移一位是3,那么rear = (rear+1) % 6,結(jié)果還是3。

分享到:
標(biāo)簽:隊(duì)列 循環(huán)
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定