使用陣列實現環形佇列Scala版本
整體思路解析
上次我們演示了使用陣列實現佇列的方式,在結尾處提出了一個問題,因為我們使用雙指標後移的方式,被彈出佇列的元素依然存在陣列中,空間不能被重複利用。
這次我們提出了使用陣列和雙指標實現環形佇列的方案。完成資源的利用。
基本思路:
1. 初始化的雙指標head 和tail 的初始值為0,在新增和彈出的時候分別將指標後移。那麼實際的tail指標是指向了最後一個數字的下一位。因此環形佇列的實際儲存長度為 陣列長度-1
2. 利用tail 和head 對陣列長度取模的方式,完成在前面的資源位置利用
3. 判斷佇列滿的條件是 (tail +1) % arrSize == head ,因為tail有可能大於head 因此需要取模
4. 注意,在顯示佇列的內容時候,分為了 tail>head 正常儲存方式 和tail < head 利用空間 的兩種展示方式
程式碼
package com.xipenhui.cn
import scala.io.StdIn
object CircleArrayTest {
def main(args: Array[String]): Unit = {
val queue = new CirccleArrayQueue(3)
while (true){
println("show 顯示當前佇列資料")
println("pop 彈出佇列頭元素")
println("add 新增元素")
println("head 顯示佇列頭元素")
println("size 檢視佇列長度")
println("exit 退出")
val input = StdIn.readLine()
input match {
case "add" =>{
println("請輸入一個數")
val num = StdIn.readInt()
queue.addQueue(num)
}
case "show" =>queue.showQueue()
case "pop" => println(s"出佇列元素為:${queue.popQueue()}")
case "size" =>println(s"佇列長度為${queue.size()}")
case "head" =>println(s"佇列頭為${queue.headElement()}")
case "exit" => System.exit(0)
}
}
}
}
class CirccleArrayQueue(arrMaxSize:Int){
val maxSiza = arrMaxSize
var head = 0 //head 和 tail維持在 0至maxsize之間,獲取值的時候與maxSiza取模
var tail = 0
val arr = new Array[Int](maxSiza) //有效儲存長度為maxsize-1
//判斷是否滿
def isFull() ={
(tail + maxSiza+1 ) % maxSiza == head
}
//判斷是否為空
def isEmpty()={
head == tail
}
//新增資料
def addQueue(num:Int): Unit ={
if(isFull){
throw new RuntimeException("queue is full,can't add elem ")
}
arr(tail) = num
tail = (tail + 1) % maxSiza
}
//彈出元素
def popQueue(): Int ={
if(isEmpty()){
throw new RuntimeException("queue is empty,can't pop element ")
}
val res = arr(head)
arr(head) = 0
head = (head + 1) % maxSiza
res
}
//顯示佇列,增加遍歷的長度,對i取模求值
def showQueue()={
if(isEmpty()){
throw new RuntimeException("queue is empty ,no element ")
}
if(tail > head){
for(i <- head until tail){
println(s"arr(${i }) = ${arr(i)}")
}
}else{
for(i <- head until tail + maxSiza){
println(s"arr(${i % maxSiza}) = ${arr(i % maxSiza)}")
}
}
}
//檢視佇列頭
def headElement() ={
if(isEmpty()){
throw new RuntimeException("queue is empty, no head")
}
arr(head)
}
//佇列長度,補齊位
def size() ={
(tail + maxSiza - head) % maxSiza
}
}
相關文章
- 陣列模擬佇列 以及佇列的複用(環形佇列)陣列佇列
- 陣列模擬佇列進階版本——環形佇列(真正意義上的排隊)陣列佇列
- 靜態佇列,迴圈陣列實現佇列陣列
- 基於Python實現環形佇列高效定時器Python佇列定時器
- C語言之環形佇列C語言佇列
- scala佇列、並行集合基本使用佇列並行
- 資料結構與演算法——佇列(環形佇列)資料結構演算法佇列
- Scala陣列操作陣列
- scala陣列與java陣列對比陣列Java
- 稀疏陣列、佇列陣列佇列
- 約瑟夫環(陣列實現)陣列
- 稀疏陣列、佇列的概念與實踐陣列佇列
- 使用 RabbitMQ 實現延時佇列MQ佇列
- Java版-資料結構-佇列(陣列佇列)Java資料結構佇列陣列
- 通過佇列實現棧OR通過棧實現佇列佇列
- 分享一篇關於Python實現環形佇列高效定時器Python佇列定時器
- RabbitMQ使用 prefetch_count優化佇列的消費,使用死信佇列和延遲佇列實現訊息的定時重試,golang版本MQ優化佇列Golang
- 佇列的一種實現:迴圈佇列佇列
- Python佇列的三種佇列實現方法Python佇列
- linux核心--使用核心佇列實現ringbufferLinux佇列
- 使用RabbitMq原生實現延遲佇列MQ佇列
- 使用Spring Boot實現訊息佇列Spring Boot佇列
- GCD之佇列的實現和使用GC佇列
- 457. 環形陣列是否存在迴圈陣列
- 9. 題目:對佇列實現棧&用棧實現佇列佇列
- scala語法 -多維陣列陣列
- Scala陣列、元組與集合陣列
- 用佇列實現棧佇列
- 用 Rust 實現佇列Rust佇列
- 佇列(Queue)-c實現佇列
- 用棧實現佇列佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 鏈式佇列—用連結串列來實現佇列佇列
- cad陣列快捷鍵命令怎麼用 cad環形陣列命令的快捷鍵陣列
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- ArrayDeque雙端佇列 使用&實現原理分析佇列
- 使用sort方法實現陣列升序降序陣列
- Day 10| 232.用棧實現佇列 、 225. 用佇列實現棧佇列