102 scala 陣列實現佇列

2021-10-07 16:40:35 字數 3318 閱讀 7417

陣列儲存佇列方式

1、指定佇列大小不重複使用,相當於一次性使用

2、每次出隊乙個元素,陣列整體向前移動一步;入隊根據座標,快,出隊需要遷移,慢

3、迴圈佇列,空間多次復用,使用佇列時不能將佇列填滿,需要空出乙個位置(推薦)

鍊錶實現佇列:鍊錶實現佇列,出隊快,入隊慢

1、單向佇列:移除節點需要臨時節點

2、雙向佇列:移除節點不需要臨時節點

3、迴圈對了:特殊場景使用,如約瑟夫問題:數數退

陣列優點:陣列實現方式資料入隊快,因為根據索引

陣列缺點:資料擴容時的資料遷移會占用大量時間,以及每次擴容因子等計算

鍊錶優點:資料出隊快,只需要將待刪除節點指引從鍊錶中移除即可

鍊錶缺點:資料入隊需要對鍊錶遍歷,找到隊尾;(可用兩個頭尾臨時節點來解決此問題)

1、陣列實現

1.1 一次性佇列

package com.cjy.chapter19.queue

object arrayqueue01

println

("隊首檢視"

)println

(queue0.

showhead()

)}}/**

* 陣列儲存佇列方式:

* 1、指定佇列大小不重複使用,相當於一次性使用

* 2、每次出隊乙個元素,陣列整體向前移動一步;入隊快,出隊慢

* 3、迴圈佇列,空間多次復用(推薦)

*///方式一:一次性佇列

class

arrayqueue01

(val newmaxsize: int)

else

}//隊列為空

def isempty()

=else

}//入隊

def addele

(ele: int)

=//隊尾後移

last +=

1//新增元素

array

(last)

= ele

ele}//出隊

def getqueue()

= first +=

1array

(first)

}//頭節點檢視

def showhead()

=array

(first +1)

}//佇列檢視

def showqueue()

: unit =

array.

foreach

(x =

>)}

//佇列中元素個數

def size()

=else

}}

1.2 迴圈佇列-自動擴容機制
package com.cjy.chapter19.queue

/** * 方式三:迴圈佇列

* 注意事項:

* 1、需要空出乙個位置,因為last是指向最後乙個元素下個座標的,例如當前有9元素,last=9,(9+1)%10=0,所以會空置出來乙個元素

* 2、first==last 時佇列空

* 3、佇列中元素個數 size 計算

* 4、出隊、入隊座標計算,加1 取模 maxsize

* 5、擴容機制,注意擴容因子,縮容因子,資料移動式資料初始化,必須先確定last值再確定first,不然last會受影響

*/object arrayqueue02

println

("出隊11個元素"

) queue0.

showqueue()

println

("長度:"

+queue0.

size()

)println

("frist:"

+queue0.first)

println

("last:"

+queue0.last)

// println("再入隊4個")

// (0 to 3).foreach(queue0.addele(_))

// queue0.showqueue()

// println("隊首檢視")

// println(queue0.showhead())

println

("-------------測試資料擴容機制")}

}class

arrayqueue02

(val newmaxsize: int)

//隊列為空

def isempty()

=//入隊

def addele

(ele: int)

:int =

//檢測資料達到80%,進行2倍擴容if(

size()

>= maxsize*

0.8)

//新增元素

array

(last)

= ele

//隊尾後移

last =

(last +1)

% maxsize

ele}//出隊

def getqueue()

=if(size()

<= maxsize/3)

val i =

array

(first)

first =

(first +1)

% maxsize

i}//頭節點檢視

def showhead()

=array

(first)

}//佇列檢視

def showqueue()

: unit =

for(i <

-0 until size()

)}//佇列中元素個數

def size()

=//資料擴容

def addsize

(nwesize:int,arr:array[int]

): unit =

last =

size()

//隊尾是長度,所以先賦值

first =

0//新的陣列隊首是0,後改,不然會影響last計算

array = newarr //陣列重新指向

maxsize = nwesize //修改最大容量

}// def subsize(size:int,arr:array[int]): unit =

// array = newarr

// }

}

使用陣列實現環形佇列Scala版本

上次我們演示了使用陣列實現佇列的方式,在結尾處提出了乙個問題,因為我們使用雙指標後移的方式,被彈出佇列的元素依然存在陣列中,空間不能被重複利用。這次我們提出了使用陣列和雙指標實現環形佇列的方案。完成資源的利用。基本思路 1.初始化的雙指標head 和tail 的初始值為0,在新增和彈出的時候分別將指...

Scala實現List陣列加法

scala實現list陣列加法 1.如下 scala arr list list 1,2,3 list 3,4,5 list 2 list 0 scala arr1 arr.flatten scala arr.aggregate 10 x,y x y.sum,m,n m n scala arr1.a...

打亂陣列Scala實現

總結 用scala的語法實現打亂陣列 打亂乙個沒有重複元素的陣列。示例 以數字集合 1,2 和 3 初始化陣列。int nums solution solution new solution nums 打亂陣列 1,2,3 並返回結果。任何 1,2,3 的排列返回的概率應該相同。solution.s...