队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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 =>
-----------------------------------------------------