Difference between revisions of "Stack Assignment"
(22 intermediate revisions by 2 users not shown) | |||
Line 3: | Line 3: | ||
=Background= | =Background= | ||
− | <youtube>wjI1WNcIntg</youtube> | + | {{CollapsibleYouTube|HackerRank: Stacks and Queues|<youtube>wjI1WNcIntg</youtube>}} |
===interface Stack=== | ===interface Stack=== | ||
− | + | <syntaxhighlight lang="java">public interface Stack<E> { | |
void push(E value); | void push(E value); | ||
− | + | E peek(); | |
− | + | E pop(); | |
− | }</ | + | }</syntaxhighlight> |
==Example== | ==Example== | ||
Line 17: | Line 17: | ||
[[File:Stack_empty.svg]] | [[File:Stack_empty.svg]] | ||
− | In this state, <code>stack.peek()</code> will return <code> | + | In this state, <code>stack.peek()</code> will return <code>null()</code> and <code>stack.pop()</code> will also return <code>null</code>. |
===push A, B, C, D, E=== | ===push A, B, C, D, E=== | ||
− | + | <syntaxhighlight lang="java">Stack<String> stack = new NotThreadSafeStack<>(); | |
stack.push("A"); | stack.push("A"); | ||
stack.push("B"); | stack.push("B"); | ||
stack.push("C"); | stack.push("C"); | ||
stack.push("D"); | stack.push("D"); | ||
− | stack.push("E");</ | + | stack.push("E"); |
+ | </syntaxhighlight> | ||
[[File:Stack_edcba.svg]] | [[File:Stack_edcba.svg]] | ||
− | In this state, <code>stack.peek()</code> will return <code> | + | In this state, <code>stack.peek()</code> will return <code>"E"</code>. |
===push A, B, C, D, E, pop=== | ===push A, B, C, D, E, pop=== | ||
− | + | <syntaxhighlight lang="java">Stack<String> stack = new NotThreadSafeStack<>(); | |
stack.push("A"); | stack.push("A"); | ||
stack.push("B"); | stack.push("B"); | ||
Line 38: | Line 39: | ||
stack.push("D"); | stack.push("D"); | ||
stack.push("E"); | stack.push("E"); | ||
− | + | String e = stack.pop(); | |
+ | </syntaxhighlight> | ||
[[File:Stack_dcba.svg]] | [[File:Stack_dcba.svg]] | ||
− | In this state, <code> | + | In this state, <code>e</code> will hold <code>"E"</code> and <code>stack.peek()</code> will return <code>"D"</code>. |
=Code To Implement= | =Code To Implement= | ||
Line 50: | Line 52: | ||
We will build an [https://www.javadoc.io/static/com.google.code.findbugs/jsr305/3.0.1/javax/annotation/concurrent/Immutable.html @Immutable] class Node. | We will build an [https://www.javadoc.io/static/com.google.code.findbugs/jsr305/3.0.1/javax/annotation/concurrent/Immutable.html @Immutable] class Node. | ||
− | {{CodeToImplement| | + | {{CodeToImplement|Node|value<br/>next|stack.node.exercise|student-pre-aspect}} |
+ | |||
+ | {{Warning|class Node is found in the stack.node.exercise package in ***student-pre-aspect***}} | ||
====constructor and instance variables==== | ====constructor and instance variables==== | ||
Line 56: | Line 60: | ||
The constructor | The constructor | ||
− | <nowiki>public | + | <nowiki>public Node(E value, Node<E> next)</nowiki> |
− | is passed a value and a | + | is passed a value and a next. Hang on to this data in instance variables. As instances of Node are to be immutable, the instance variables should be marked as <code>final</code> which prevents them from being re-assigned. |
====value==== | ====value==== | ||
Line 64: | Line 68: | ||
return the value. | return the value. | ||
− | ==== | + | ====next==== |
return the next node. | return the next node. | ||
− | == | + | ==NotThreadSafeStack== |
− | + | <syntaxhighlight lang="java"> | |
− | + | @NotThreadSafe | |
− | + | public class NotThreadSafeStack<E> implements Stack<E> | |
− | + | </syntaxhighlight> | |
− | |||
− | |||
− | |||
− | |||
{{NotThreadSafeLink}} | {{NotThreadSafeLink}} | ||
{{CodeToImplement|NotThreadSafeStack|push<br/>peek<br/>pop|stack.notthreadsafe.exercise}} | {{CodeToImplement|NotThreadSafeStack|push<br/>peek<br/>pop|stack.notthreadsafe.exercise}} | ||
+ | |||
+ | '''Note:''' The constructor has been intentionally omitted. Simply initialize the instance variable you need when you declare it. | ||
====instance variables==== | ====instance variables==== | ||
Line 90: | Line 92: | ||
=Distasters To Investigate= | =Distasters To Investigate= | ||
+ | NOTE: you only need to investigate these disaster clients. You need not fix them. Our NotThreadSafeStack is designed to be used in a single sequential thread. Not surprisingly, it fails when it is mutated in parallel. | ||
+ | |||
==ParallelPushStackDisasterClient== | ==ParallelPushStackDisasterClient== | ||
− | {{ | + | {{BrokenCodeToInvestigate|ParallelPushStackDisasterClient|main|stack.notthreadsafe.disaster|main}} |
==ParallelPushAndPopStackDisasterClient== | ==ParallelPushAndPopStackDisasterClient== | ||
− | {{ | + | {{BrokenCodeToInvestigate|ParallelPushAndPopStackDisasterClient|main|stack.notthreadsafe.disaster|main}} |
=Testing= | =Testing= | ||
− | |||
− | |||
− | |||
− | |||
− | |||
{{TestSuite|_NotThreadSafeStackTestSuite|stack.notthreadsafe.exercise}} | {{TestSuite|_NotThreadSafeStackTestSuite|stack.notthreadsafe.exercise}} | ||
=Pledge, Acknowledgments, Citations= | =Pledge, Acknowledgments, Citations= | ||
− | {{Pledge| | + | {{Pledge|stack}} |
Latest revision as of 14:27, 3 September 2024
Contents
Motivation
We will build an initial not-thread-safe implementation of a Stack. This exercise will allow us to gain experience building a data structure and see how it performs when used in a parallel for which it was not designed. Later in the semester we will build two thread-safe implementations: one concurrent and one atomic. Your work on this exercise will pay dividends on these later exercises.
Background
Video: HackerRank: Stacks and Queues |
---|
interface Stack
public interface Stack<E> {
void push(E value);
E peek();
E pop();
}
Example
empty
Stack<String> stack = new NotThreadSafeStack<>();
In this state, stack.peek()
will return null()
and stack.pop()
will also return null
.
push A, B, C, D, E
Stack<String> stack = new NotThreadSafeStack<>();
stack.push("A");
stack.push("B");
stack.push("C");
stack.push("D");
stack.push("E");
In this state, stack.peek()
will return "E"
.
push A, B, C, D, E, pop
Stack<String> stack = new NotThreadSafeStack<>();
stack.push("A");
stack.push("B");
stack.push("C");
stack.push("D");
stack.push("E");
String e = stack.pop();
In this state, e
will hold "E"
and stack.peek()
will return "D"
.
Code To Implement
Node
The mighty cons cell goes back to the early days of computing. People have been building amazing systems with this data structure since the 1950s.
We will build an @Immutable class Node.
class: | Node.java | |
methods: | value next |
|
package: | stack.node.exercise | |
source folder: | student-pre-aspect/src/main/java |
Warning:class Node is found in the stack.node.exercise package in ***student-pre-aspect*** |
constructor and instance variables
The constructor
public Node(E value, Node<E> next)
is passed a value and a next. Hang on to this data in instance variables. As instances of Node are to be immutable, the instance variables should be marked as final
which prevents them from being re-assigned.
value
return the value.
next
return the next node.
NotThreadSafeStack
@NotThreadSafe
public class NotThreadSafeStack<E> implements Stack<E>
class: | NotThreadSafeStack.java | |
methods: | push peek pop |
|
package: | stack.notthreadsafe.exercise | |
source folder: | student/src/main/java |
Note: The constructor has been intentionally omitted. Simply initialize the instance variable you need when you declare it.
instance variables
What state do you need to keep track of to support a mutable non-thread-safe Stack?
push
peek
pop
Distasters To Investigate
NOTE: you only need to investigate these disaster clients. You need not fix them. Our NotThreadSafeStack is designed to be used in a single sequential thread. Not surprisingly, it fails when it is mutated in parallel.
ParallelPushStackDisasterClient
class: | ParallelPushStackDisasterClient.java | Broken |
methods: | main | |
package: | stack.notthreadsafe.disaster | |
source folder: | src/main/java |
ParallelPushAndPopStackDisasterClient
class: | ParallelPushAndPopStackDisasterClient.java | Broken |
methods: | main | |
package: | stack.notthreadsafe.disaster | |
source folder: | src/main/java |
Testing
class: | _NotThreadSafeStackTestSuite.java | |
package: | stack.notthreadsafe.exercise | |
source folder: | testing/src/test/java |
Pledge, Acknowledgments, Citations
file: | stack-pledge-acknowledgments-citations.txt |
More info about the Honor Pledge