Scala集合:Queue和Stack

Queue

队列(queue)是一种“先进先出”的数据结构。这一节我们学习如何使用Scala的不可变队列,以及执行一些常见的操作,如初始化,添加或删除元素,在队列中通过键找到元素,入队和出队。Queue的元素是先进先出顺序(FIFO)的。

【示例】使用不可变队列的示例。

import scala.collection.immutable.Queue

object QueueDemo {
  def main(args: Array[String]): Unit = {
    println("1: 初始化一个有3个元素的队列")
    val queue1: Queue[String] = Queue("苹果", "香蕉", "葡萄干")
    println(s"queue1的元素 = $queue1")

    println("\n2: 访问一个队列中特定索引的元素")
    println(s"索引0处的元素 = ${queue1(0)}")
    println(s"索引0处的元素 = ${queue1.head}")
    println(s"索引1处的元素 = ${queue1(1)}")
    println(s"索引2处的元素 = ${queue1(2)}")

    println("\n3: 使用 :+ 在队列中添加元素")
    val queue2: Queue[String] = queue1 :+ "Glazed Donut"
    println(s"queue2的元素 = $queue2")

    println("\n4: 使用 enqueue函数向队列中添加元素")
    val enqueue: Queue[String] = queue1.enqueue("火龙果")
    println(s"enqueue的元素 = $enqueue")

    println("\n5: 使用dequeue函数从队列中获取第一个元素")
    val dequeue: (String, Queue[String]) = queue1.dequeue
    // 调用dequeue返回Tuple2,其中包含插入到Queue的第一个元素和队列的其余元素
    println(s"dequeue的第一个元素 = ${dequeue._1}")
    println(s"dequeue后的剩余元素 = ${dequeue._2}")

    println("\n6: 使用 ++ 将两个队列添加到一起")
    val queue3: Queue[String] = queue1 ++ Queue[String]("草莓", "菠萝")
    println(s"queue3中的元素 = $queue3")

    println("\n7: 初始化一个空队列")
    val emptyQueue: Queue[String] = Queue.empty[String]
    println(s"Empty Queue = $emptyQueue")
  }
}

Stack

栈(又叫堆栈)是一种遵循后进先出语义的数据结构。它通常提供一个push()方法在栈顶添加元素,以及一个pop()方法从栈顶获取最近添加的元素。

在本节,我们将学习如何使用Scala的不可变Stack栈来执行一些常见的操作,比如将新元素推入栈顶,从栈中移除或弹出元素。值得注意的是,从Scala 2.13.0开始,Immutable Stack类已经被弃用,可以使用Immutable List来实现类似堆栈的操作。

【示例】使用Immutable List来实现类似堆栈的操作。

import scala.collection.immutable.Stack

object StackDemo {
  def main(args: Array[String]): Unit = {
    println("1: 初始化堆栈")
    val stack1: Stack[String] = Stack("苹果", "香蕉", "葡萄干")
    println(s"stack1的元素 = $stack1")

    println("\n2: 使用不可变列表List初始化堆栈")
    val stack2: List[String] = List("苹果", "香蕉", "葡萄干")
    println(s"使用不可变列表的堆栈,元素是 = $stack2")

    println("\n3: 使用Immutable List的::将一个元素压入栈顶")
    val stack3: List[String] = "火龙果" :: stack2
    println(s"使用不可变列表的堆栈,push后的元素 = $stack3")

    println("\n4: 使用Immutable List的::将N个元素推入栈顶")
    val stack4: List[String] = "草莓" :: "荔枝" :: stack2
    println(s"使用不可变列表的堆栈,phsh N个元素后 = $stack4")

    println("\n5: 使用Immutable List的tail函数从Stack中弹出元素")
    val stack5: List[String] = stack2.tail
    println(s"使用不可变列表进行堆栈,tail函数模拟堆栈弹出后的元素 = $stack5")

    println("\n6: 使用不可变列表初始化一个空堆栈")
    val emptyStack: List[String] = List.empty[String]
    println(s"使用不可变列表的堆栈,空堆栈 = $emptyStack")
  }
}

《Spark原理深入与编程实战》