使用數(shù)組實現(xiàn)環(huán)形隊列

整體思路解析

上次我們演示了使用數(shù)組實現(xiàn)隊列的方式,在結尾處提出了一個問題,因為我們使用雙指針后移的方式,被彈出隊列的元素依然存在數(shù)組中衅码,空間不能被重復利用。
這次我們提出了使用數(shù)組和雙指針實現(xiàn)環(huán)形隊列的方案脊岳。完成資源的利用逝段。
基本思路:
1. 初始化的雙指針head 和tail 的初始值為0,在添加和彈出的時候分別將指針后移割捅。那么實際的tail指針是指向了最后一個數(shù)字的下一位奶躯。因此環(huán)形隊列的實際存儲長度為 數(shù)組長度-1
2. 利用tail 和head 對數(shù)組長度取模的方式,完成在前面的資源位置利用
3. 判斷隊列滿的條件是 (tail +1) % arrSize == head ,因為tail有可能大于head 因此需要取模
4. 注意亿驾,在顯示隊列的內(nèi)容時候嘹黔,分為了 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 顯示當前隊列數(shù)據(jù)")
      println("pop 彈出隊列頭元素")
      println("add 添加元素")
      println("head 顯示隊列頭元素")
      println("size 查看隊列長度")
      println("exit 退出")
      val input = StdIn.readLine()
      input match {
        case "add" =>{
          println("請輸入一個數(shù)")
          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
  }

  //添加數(shù)據(jù)
  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
  }
}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疼邀,隨后出現(xiàn)的幾起案子喂江,更是在濱河造成了極大的恐慌,老刑警劉巖旁振,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件开呐,死亡現(xiàn)場離奇詭異,居然都是意外死亡规求,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門卵惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阻肿,“玉大人,你說我怎么就攤上這事沮尿〈运” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵畜疾,是天一觀的道長赴邻。 經(jīng)常有香客問我,道長啡捶,這世上最難降的妖魔是什么姥敛? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮瞎暑,結果婚禮上彤敛,老公的妹妹穿的比我還像新娘与帆。我一直安慰自己,他們只是感情好墨榄,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布玄糟。 她就那樣靜靜地躺著,像睡著了一般袄秩。 火紅的嫁衣襯著肌膚如雪阵翎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天之剧,我揣著相機與錄音郭卫,去河邊找鬼。 笑死猪狈,一個胖子當著我的面吹牛箱沦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雇庙,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谓形,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疆前?” 一聲冷哼從身側響起寒跳,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竹椒,沒想到半個月后童太,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡胸完,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年书释,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赊窥。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡爆惧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锨能,到底是詐尸還是另有隱情扯再,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布址遇,位于F島的核電站熄阻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倔约。R本人自食惡果不足惜秃殉,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧复濒,春花似錦脖卖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砸泛,卻和暖如春十籍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唇礁。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工勾栗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盏筐。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓围俘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親琢融。 傳聞我的和親對象是個殘疾皇子界牡,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354