This is an excerpt from the Scala Cookbook (partially modified for the internet). This is Recipe 11.30, “How to Use a Stack in Scala”
Problem
You want to use a stack data structure in a Scala application.
Solution
A stack is a last-in, first-out (LIFO) data structure. In most programming languages you add elements to a stack using a push
method, and take elements off the stack with pop
, and Scala is no different.
Scala has both immutable and mutable versions of a stack, as well as an ArrayStack
(discussed shortly). The following examples demonstrate how to use the mutable Scala Stack class.
Create an empty, mutable stack of any data type:
import scala.collection.mutable.Stack var ints = Stack[Int]() var fruits = Stack[String]() case class Person(var name: String) var people = Stack[Person]()
You can also populate a stack with initial elements when you create it:
val ints = Stack(1, 2, 3)
Once you have a mutable stack, push elements onto the stack with push
:
// create a stack scala> var fruits = Stack[String]() fruits: scala.collection.mutable.Stack[String] = Stack() // add one element at a time scala> fruits.push("apple") res0: scala.collection.mutable.Stack[String] = Stack(apple) scala> fruits.push("banana") res1: scala.collection.mutable.Stack[String] = Stack(banana, apple) // add multiple elements scala> fruits.push("coconut", "orange", "pineapple") res2: scala.collection.mutable.Stack[String] = Stack(pineapple, orange, coconut, banana, apple)
To take elements off the stack, pop them off the top of the stack with pop
:
scala> val next = fruits.pop next: String = pineapple scala> fruits res3: scala.collection.mutable.Stack[String] = Stack(orange, coconut, banana, apple)
You can peek at the next element on the stack without removing it, using top
:
scala> fruits.top res4: String = orange // 'orange' is still on the top scala> fruits res5: scala.collection.mutable.Stack[String] = Stack(orange, coconut, banana, apple)
Stack
extends from Seq
, so you can inspect it with the usual methods:
scala> fruits.size res6: Int = 4 scala> fruits.isEmpty res7: Boolean = false
You can empty a mutable stack with clear
:
scala> fruits.clear scala> fruits res8: scala.collection.mutable.Stack[String] = Stack()
Discussion
There’s also an ArrayStack
class, and according to the Scala documentation, “It provides fast indexing and is generally slightly more efficient for most operations than a normal mutable stack.”
Although I haven’t used an immutable Stack
, I’ve seen several people recommend using a List
instead of an immutable Stack
for this use case. A List
has at least one less layer of code, and you can push elements onto the List
with ::
and access the first element with the head
method.
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |
See Also
- The mutable Stack class
- The immutable Stack class
- The ArrayStack class