Skip to content

Commit d1acb4e

Browse files
author
ivan
committed
impl ch08 and browser demo
1 parent 6c4f93f commit d1acb4e

File tree

5 files changed

+166
-2
lines changed

5 files changed

+166
-2
lines changed

scala/src/main/scala/ch07_linkedlist/LinkedListAlgo.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package ch07_linkedlist
22

33
import ch06_linkedlist.Node
44

5-
import scala.util.control.Breaks._
6-
75
object LinkedListAlgo {
86

97
//reverse a linked list
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ch08_stack
2+
3+
class BrowserDemo(var currentPageOpt: Option[String], val backStack: StackDemo[String],
4+
val forwardStack: StackDemo[String]) {
5+
6+
def this() = this(None, new StackDemo[String], new StackDemo[String])
7+
8+
def open(page: String) = {
9+
currentPageOpt.foreach(backStack.push)
10+
forwardStack.clear()
11+
currentPageOpt = Some(page)
12+
}
13+
14+
def canGoBack(): Boolean = backStack.size > 0
15+
16+
def goBack(): Unit = {
17+
backStack.pop().foreach(page => {
18+
forwardStack.push(currentPageOpt.get)
19+
currentPageOpt = Some(page.data)
20+
})
21+
}
22+
23+
def canGoForward(): Boolean = forwardStack.size > 0
24+
25+
def goForward(): Unit = {
26+
forwardStack.pop().foreach(page => {
27+
backStack.push(currentPageOpt.get)
28+
currentPageOpt = Some(page.data)
29+
})
30+
}
31+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package ch08_stack
2+
3+
class Node[T](var data: T, var next: Option[Node[T]])
4+
5+
class StackDemo[T] {
6+
7+
8+
var headOpt: Option[Node[T]] = None
9+
var size = 0
10+
11+
def clear(): Unit = {
12+
headOpt = None
13+
size = 0
14+
}
15+
16+
def push(data: T) = {
17+
val newHead = new Node(data, headOpt)
18+
headOpt = Some(newHead)
19+
size += 1
20+
}
21+
22+
def pop(): Option[Node[T]] = {
23+
headOpt match {
24+
case None => None
25+
case Some(head) =>
26+
headOpt = head.next
27+
size -= 1
28+
Some(head)
29+
30+
}
31+
}
32+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package ch08_stack
2+
3+
import org.scalatest.{FlatSpec, Matchers}
4+
5+
class BrowserDemoTest extends FlatSpec with Matchers {
6+
7+
behavior of "BrowserDemoTest"
8+
9+
it should "canGoBack" in {
10+
val browser = new BrowserDemo()
11+
assert(!browser.canGoBack())
12+
browser.open("a")
13+
assert(!browser.canGoBack())
14+
browser.open("b")
15+
assert(browser.canGoBack())
16+
browser.currentPageOpt.get should equal("b")
17+
}
18+
19+
it should "goBack" in {
20+
val browser = new BrowserDemo()
21+
browser.open("a")
22+
browser.open("b")
23+
browser.currentPageOpt.get should equal("b")
24+
assert(browser.canGoBack())
25+
browser.goBack()
26+
assert(!browser.canGoBack())
27+
browser.currentPageOpt.get should equal("a")
28+
}
29+
30+
it should "canGoForward" in {
31+
val browser = new BrowserDemo()
32+
browser.open("a")
33+
browser.open("b")
34+
browser.currentPageOpt.get should equal("b")
35+
assert(browser.canGoBack())
36+
browser.goBack()
37+
assert(!browser.canGoBack())
38+
browser.currentPageOpt.get should equal("a")
39+
assert(browser.canGoForward())
40+
}
41+
42+
it should "goForward" in {
43+
val browser = new BrowserDemo()
44+
browser.open("a")
45+
browser.open("b")
46+
browser.currentPageOpt.get should equal("b")
47+
assert(browser.canGoBack())
48+
browser.goBack()
49+
assert(!browser.canGoBack())
50+
browser.currentPageOpt.get should equal("a")
51+
assert(browser.canGoForward())
52+
browser.goForward()
53+
browser.currentPageOpt.get should equal("b")
54+
}
55+
56+
it should "open new page to clear forward stack" in {
57+
val browser = new BrowserDemo()
58+
browser.open("a")
59+
browser.open("b")
60+
browser.currentPageOpt.get should equal("b")
61+
assert(browser.canGoBack())
62+
browser.goBack()
63+
assert(!browser.canGoBack())
64+
browser.currentPageOpt.get should equal("a")
65+
assert(browser.canGoForward())
66+
browser.open("c")
67+
assert(!browser.canGoForward())
68+
browser.goBack()
69+
browser.currentPageOpt.get should equal("a")
70+
}
71+
72+
73+
74+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package ch08_stack
2+
3+
import org.scalatest.{FlatSpec, Matchers}
4+
5+
class StackDemoTest extends FlatSpec with Matchers {
6+
7+
behavior of "StackDemoTest"
8+
9+
it should "push/pop should be FILO" in {
10+
val stack = new StackDemo[String]
11+
val num = 100
12+
for (i <- 1 to num) {
13+
stack.push(i.toString)
14+
}
15+
16+
for (i <- num to 1 by -1) {
17+
stack.pop().get.data should equal(i.toString)
18+
}
19+
}
20+
21+
it should "pop should also work for empty stack" in {
22+
val stack = new StackDemo[Int]
23+
val num = 100
24+
for (i <- num to 1 by -1) {
25+
assert(stack.pop().isEmpty)
26+
}
27+
}
28+
29+
}

0 commit comments

Comments
 (0)