StacksQueues/Java/LinkedStack: Difference between revisions
From charlesreid1
No edit summary |
m (Replacing charlesreid1.com:3000 with git.charlesreid1.com) |
||
| (3 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
= | Implementation of a stack data structure using a circular linked list. | ||
==Code== | |||
===Repo=== | |||
Link to the LinkedStack object on git.charlesreid1.com: https://git.charlesreid1.com/cs/java/src/master/stacks-queues-deques/stacks/LinkedStack.java | |||
===Interface=== | |||
See also [[Abstract Data Types#Stacks]] | |||
LinkedStack implements a standard stack interface: | |||
* size | |||
* isEmpty | |||
* poop | |||
* push | |||
* peek | |||
===Test=== | |||
<pre> | |||
public static void main(String[] args) { | |||
LinkedStack<Integer> s = new LinkedStack<Integer>(); | |||
System.out.println("New stack:"); | |||
System.out.println(s); | |||
System.out.println("Is empty? " + s.isEmpty()); | |||
try { | |||
s.push(100); | |||
s.push(200); | |||
s.push(300); | |||
System.out.println("Size = " + s.size()); | |||
System.out.println("Peek = " + s.peek()); | |||
for(int i=0; i<10; i++) { | |||
s.push(i*i); | |||
} | |||
System.out.println("Is empty? " + s.isEmpty()); | |||
System.out.println("Size before pop = " + s.size()); | |||
System.out.println("Peek = " + s.peek()); | |||
System.out.println("Popping: "+s.pop()); | |||
System.out.println("Size after pop = " + s.size()); | |||
} catch(Empty e) { | |||
System.out.println("Handled an unexpected Empty exception!"); | |||
} | |||
try { | |||
for(int i=0; i<1000; i++) { | |||
System.out.printf("Popping %d. %d to go! \n", s.pop(), s.size()); | |||
} | |||
} catch(Empty e) { | |||
System.out.println("Handled an expected Empty exception."); | |||
System.out.println("Is empty? " + s.isEmpty()); | |||
} | |||
} | |||
</pre> | |||
===The Class=== | |||
<pre> | |||
class Empty extends ArrayIndexOutOfBoundsException {} | |||
public class LinkedStack<E> { | |||
//////////////////////////////// | |||
Node<E> head; | |||
int size; | |||
public LinkedStack() { | |||
this.size = 0; | |||
} | |||
/** Return number of elements in the linked stack */ | |||
public int size(){ return this.size; } | |||
/** Return boolean: is the stack empty? */ | |||
public boolean isEmpty() { return this.size==0; } | |||
/** Push an item onto the top of the stack. | |||
* Add to front of linked list. | |||
*/ | |||
public void push(E e) { | |||
// if empty, head is null, so bottom of stack points to null | |||
Node<E> oldhead = head; | |||
Node<E> newhead = new Node<E>(e,oldhead); | |||
head = newhead; | |||
size++; | |||
} | |||
/** Pop an item from the top of the stack and return it. | |||
* Remove item from front of linked list. | |||
*/ | |||
public E pop() throws Empty { | |||
if(isEmpty()) { | |||
throw new Empty(); | |||
} | |||
// assert size >= 1 | |||
// get your return value from the top of the stack | |||
Node<E> chosen = head; | |||
E ret = chosen.getData(); | |||
// set head pointer to next inn line | |||
head = chosen.getNext(); | |||
// chosen is fed to the Sarlacc (a.k.a. the Java Garbage Collector) | |||
size--; | |||
return ret; | |||
} | |||
/** Return reference to top item without removing it. */ | |||
public E peek() throws Empty { | |||
if(isEmpty()) { | |||
throw new Empty(); | |||
} | |||
Node<E> chosen = head; | |||
E ret = chosen.getData(); | |||
return ret; | |||
} | |||
/** String representation of this thing. | |||
* Technically, this is kind of cheating. | |||
*/ | |||
public String toString() { | |||
if(isEmpty()) { | |||
return "[ ]"; | |||
} else { | |||
// assertion: size>=1 | |||
StringBuffer sb = new StringBuffer(); | |||
sb.append("[ "); | |||
int k=0; | |||
Node<E> runner = head; | |||
sb.append(runner); | |||
k++; | |||
while(k<size && runner.getNext() != null) { | |||
runner = runner.getNext(); | |||
k++; | |||
} | |||
sb.append("]"); | |||
return sb.toString(); | |||
} | |||
} | |||
} | |||
</pre> | |||
=Flags= | =Flags= | ||
| Line 8: | Line 152: | ||
{{DataStructuresFlag}} | {{DataStructuresFlag}} | ||
[[Category:Java]] | [[Category:Java]] | ||
[[Category:Linked Lists]] | |||
[[Category:Stacks]] | |||
Latest revision as of 03:54, 9 October 2019
Implementation of a stack data structure using a circular linked list.
Code
Repo
Link to the LinkedStack object on git.charlesreid1.com: https://git.charlesreid1.com/cs/java/src/master/stacks-queues-deques/stacks/LinkedStack.java
Interface
See also Abstract Data Types#Stacks
LinkedStack implements a standard stack interface:
- size
- isEmpty
- poop
- push
- peek
Test
public static void main(String[] args) {
LinkedStack<Integer> s = new LinkedStack<Integer>();
System.out.println("New stack:");
System.out.println(s);
System.out.println("Is empty? " + s.isEmpty());
try {
s.push(100);
s.push(200);
s.push(300);
System.out.println("Size = " + s.size());
System.out.println("Peek = " + s.peek());
for(int i=0; i<10; i++) {
s.push(i*i);
}
System.out.println("Is empty? " + s.isEmpty());
System.out.println("Size before pop = " + s.size());
System.out.println("Peek = " + s.peek());
System.out.println("Popping: "+s.pop());
System.out.println("Size after pop = " + s.size());
} catch(Empty e) {
System.out.println("Handled an unexpected Empty exception!");
}
try {
for(int i=0; i<1000; i++) {
System.out.printf("Popping %d. %d to go! \n", s.pop(), s.size());
}
} catch(Empty e) {
System.out.println("Handled an expected Empty exception.");
System.out.println("Is empty? " + s.isEmpty());
}
}
The Class
class Empty extends ArrayIndexOutOfBoundsException {}
public class LinkedStack<E> {
////////////////////////////////
Node<E> head;
int size;
public LinkedStack() {
this.size = 0;
}
/** Return number of elements in the linked stack */
public int size(){ return this.size; }
/** Return boolean: is the stack empty? */
public boolean isEmpty() { return this.size==0; }
/** Push an item onto the top of the stack.
* Add to front of linked list.
*/
public void push(E e) {
// if empty, head is null, so bottom of stack points to null
Node<E> oldhead = head;
Node<E> newhead = new Node<E>(e,oldhead);
head = newhead;
size++;
}
/** Pop an item from the top of the stack and return it.
* Remove item from front of linked list.
*/
public E pop() throws Empty {
if(isEmpty()) {
throw new Empty();
}
// assert size >= 1
// get your return value from the top of the stack
Node<E> chosen = head;
E ret = chosen.getData();
// set head pointer to next inn line
head = chosen.getNext();
// chosen is fed to the Sarlacc (a.k.a. the Java Garbage Collector)
size--;
return ret;
}
/** Return reference to top item without removing it. */
public E peek() throws Empty {
if(isEmpty()) {
throw new Empty();
}
Node<E> chosen = head;
E ret = chosen.getData();
return ret;
}
/** String representation of this thing.
* Technically, this is kind of cheating.
*/
public String toString() {
if(isEmpty()) {
return "[ ]";
} else {
// assertion: size>=1
StringBuffer sb = new StringBuffer();
sb.append("[ ");
int k=0;
Node<E> runner = head;
sb.append(runner);
k++;
while(k<size && runner.getNext() != null) {
runner = runner.getNext();
k++;
}
sb.append("]");
return sb.toString();
}
}
}
Flags
| Data Structures Part of Computer Science Notes
This is the staging ground for computer science notes as part of the 2017 CS Study Plan.
Classes of data structures: Abstract Data Types Array-based and Link-based memory management: ArrayLists and Linked Lists Algorithmic Analysis of Data Structures: Algorithmic Analysis of Data Structures Advanced data structures: Advanced Data Structures
|
| Arrays Part of Computer Science Notes
Series on Data Structures Python: Arrays/Python · Arrays/Python/Sizeof · Arrays/Python/AppendCost · Arrays/Python/CaesarCipher · Arrays/Python/CompactArrays · Arrays/Python/DynamicArray Java: Arrays/Java · Arrays/Java/CaesarCipher · Arrays/Java/FisherYates · Arrays/Java/PythonList · Arrays/Java/Repeatedly_Remove Categories: Category:Python Arrays
|
| Stacks and Queues Part of Computer Science Notes
Series on Data Structures
Stacks and Queues: Python StacksQueues/Python · StacksQueues/Python/ArrayStack · StacksQueues/Python/ArrayQueue · StacksQueues/Python/ArrayDeque StacksQueues/Python/LinkedStack
Stacks and Queues: Java StacksQueues/Java · StacksQueues/Java/ArrayStack · StacksQueues/Java/ArrayQueue · StacksQueues/Java/ArrayQueueFS · StacksQueues/Java/ArrayDeque StacksQueues/Java/LinkedStack · StacksQueues/Java/LinkedQueue · StacksQueues/Java/LinkedDeque
Applications Postfix_Expressions#Stacks · StacksQueues/Subsets · StacksQueues/Subsets/Java
|
| Priority Queues and Heaps Part of Computer Science Notes
Series on Data Structures
Java: Priority Queues/Java · Priority Queues/ADT · Priority Queues/Sorted · Priority Queues/Unsorted Performance: Priority Queues/Timing and Performance Applications: Maximum Oriented Priority Queue · Priority Queues/Stack
Priority Queues/Heap · Priority Queues/Java · Priority Queues/Comparators
|
| Linked List Part of Computer Science Notes
Series on Data Structures Java: Linked Lists/Java · Linked Lists/Java/Single · Linked Lists/Java/Double · Linked Lists/Java/Circular Performance: Linked Lists/Java/Timing · Linked Lists/Java/Reverse Python: Linked Lists/Python · Linked Lists/Python/Single
|
| Trees Part of Computer Science Notes
Series on Data Structures Abstract data type: Trees/ADT Concrete implementations: Trees/LinkedTree · Trees/ArrayTree · SimpleTree
Tree Traversal Preorder traversal: Trees/Preorder Postorder traversal: Trees/Postorder In-Order traversal: Binary Trees/Inorder Breadth-First Search: BFS Breadth-First Traversal: BFT Depth-First Search: DFS Depth-First Traversal: DFT OOP Principles for Traversal: Tree Traversal/OOP · Tree Traversal/Traversal Method Template Tree operations: Trees/Operations Performance · Trees/Removal
Tree Applications Finding Minimum in Log N Time: Tree/LogN Min Search
Abstract data type: Binary Trees/ADT Concrete implementations: Binary Trees/LinkedBinTree · Binary Trees/ArrayBinTree Binary Trees/Cheat Sheet · Binary Trees/OOP · Binary Trees/Implementation Notes
|
| Search Trees Part of Computer Science Notes
Series on Data Structures
Binary Search Trees · Balanced Search Trees Trees/OOP · Search Trees/OOP · Tree Traversal/OOP · Binary Trees/Inorder
(Note that heaps are also value-sorting trees with minimums at the top. See Template:PriorityQueuesFlag and Priority Queues.)
|
| Maps and Dictionaries Part of Computer Science Notes
Series on Data Structures
Maps/Dictionaries Maps · Maps/ADT · Maps in Java · Maps/OOP · Maps/Operations and Performance Map implementations: Maps/AbstractMap · Maps/UnsortedArrayMap · Maps/SortedArrayMap Dictionary implementations: Dictionaries/LinkedDict · Dictionaries/ArrayDict
Hashes Hash Maps/OOP · Hash Maps/Operations and Performance Hash Maps/Dynamic Resizing · Hash Maps/Collision Handling with Chaining Hash functions: Hash Functions · Hash Functions/Cyclic Permutation Hash map implementations: Hash Maps/AbstractHashMap · Hash Maps/ChainedHashMap
Skip Lists · Java/ConcurrentSkipList · Java implementations: SkipList
Sets Sets · Sets/ADT · Sets in Java · Sets/OOP · Multisets
|