数据结构 -- 队列 (scala版)

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。


队列的入队和出队过程

在这里插入图片描述


scala实现

class Queue {
  var size: Int = 0
  var head: Node = null
  var tail: Node = null

  /**
   * 入队
   *
   * @param e
   */
  def enqueue(e: Any): Unit = {
    if (this.tail == null) {
      this.tail = Node(e, null)
      this.head = this.tail
    } else {
      val newNode = Node(e, null)
      this.tail.next = newNode
      this.tail = this.tail.next
    }
    this.size += 1
  }

  def isEmpty(): Boolean = {
    this.size == 0
  }

  /**
   * 出队
   *
   * @return
   */
  def dequeue(): Any = {
    if (isEmpty) {
      throw new Exception("queue already empty!")
    }
    val retNode = this.head
    this.head = this.head.next
    retNode.next = null
    if (this.head == null) {
      this.tail = null
    }
    this.size -= 1
    retNode.e
  }

  /**
   * 头部
   *
   * @return
   */
  def front() = {
    if (this.head != null) {
      this.head.e
    } else {
      null
    }
  }

  def getSize() = {
    this.size
  }

  override def toString: String = {
    _toString()
  }

  def _toString() = {
    var copyNode = this.head
    val stringBuffer = new StringBuffer()
    while (copyNode != null) {
      stringBuffer.append(copyNode.e).append(" => ")
      copyNode = copyNode.next
    }
    stringBuffer.toString()
  }
}

object Queue {
  def apply(): Queue = new Queue()

  def main(args: Array[String]): Unit = {
    val arr = Array(27, 24, 16, 42, 41, 25, 20, 37, 20, 13, 14, 2, 39, 5, 16)
    val queue = Queue()
    for (i <- 0 until arr.length) {
      println("----------- --------------")
      println(queue.toString)
      println(s"将要入队元素 :${arr(i)}")
      queue.enqueue(arr(i))
      if (i % 5 == 4) {
        println(s"dequeue : ${queue.dequeue()}")
      }
      println(s"size : ${queue.getSize()}")
      println(queue.toString)
      println("-----------------------------------------------------")

    }
  }
}

case class Node(e: Any, var next: Node) {
  override def toString: String = {
    e.toString
  }
}

运行结果

----------- --------------

将要入队元素 :27
size : 1
27 => 
-----------------------------------------------------
----------- --------------
27 => 
将要入队元素 :24
size : 2
27 => 24 => 
-----------------------------------------------------
----------- --------------
27 => 24 => 
将要入队元素 :16
size : 3
27 => 24 => 16 => 
-----------------------------------------------------
----------- --------------
27 => 24 => 16 => 
将要入队元素 :42
size : 4
27 => 24 => 16 => 42 => 
-----------------------------------------------------
----------- --------------
27 => 24 => 16 => 42 => 
将要入队元素 :41
dequeue : 27
size : 4
24 => 16 => 42 => 41 => 
-----------------------------------------------------
----------- --------------
24 => 16 => 42 => 41 => 
将要入队元素 :25
size : 5
24 => 16 => 42 => 41 => 25 => 
-----------------------------------------------------
----------- --------------
24 => 16 => 42 => 41 => 25 => 
将要入队元素 :20
size : 6
24 => 16 => 42 => 41 => 25 => 20 => 
-----------------------------------------------------
----------- --------------
24 => 16 => 42 => 41 => 25 => 20 => 
将要入队元素 :37
size : 7
24 => 16 => 42 => 41 => 25 => 20 => 37 => 
-----------------------------------------------------
----------- --------------
24 => 16 => 42 => 41 => 25 => 20 => 37 => 
将要入队元素 :20
size : 8
24 => 16 => 42 => 41 => 25 => 20 => 37 => 20 => 
-----------------------------------------------------
----------- --------------
24 => 16 => 42 => 41 => 25 => 20 => 37 => 20 => 
将要入队元素 :13
dequeue : 24
size : 8
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 
-----------------------------------------------------
----------- --------------
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 
将要入队元素 :14
size : 9
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 
-----------------------------------------------------
----------- --------------
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 
将要入队元素 :2
size : 10
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 2 => 
-----------------------------------------------------
----------- --------------
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 2 => 
将要入队元素 :39
size : 11
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 2 => 39 => 
-----------------------------------------------------
----------- --------------
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 2 => 39 => 
将要入队元素 :5
size : 12
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 2 => 39 => 5 => 
-----------------------------------------------------
----------- --------------
16 => 42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 2 => 39 => 5 => 
将要入队元素 :16
dequeue : 16
size : 12
42 => 41 => 25 => 20 => 37 => 20 => 13 => 14 => 2 => 39 => 5 => 16 => 
-----------------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值