Stacks: Last-In, First-Out (LIFO)
Queues: First-In, First-Out (FIFO)
│ │
│ │
│ │
├─────────┤
│ D │ ← top
├─────────┤
│ C │
├─────────┤
│ B │
├─────────┤
│ A │
└─────────┘
│ ↓ │
├─────────┤
│ E │ ← top
├─────────┤
│ D │
├─────────┤
│ C │
├─────────┤
│ B │
├─────────┤
│ A │
└─────────┘
push(E)
│ F │ ← top
├─────────┤
│ E │
├─────────┤
│ D │
├─────────┤
│ C │
├─────────┤
│ B │
├─────────┤
│ A │
└─────────┘
push(F)
│ │
├─────────┤
│ E │ ← top
├─────────┤
│ D │
├─────────┤
│ C │
├─────────┤
│ B │
├─────────┤
│ A │
└─────────┘
pop() → returns F
returns top and updates it (removes top)
│ │
│ │
│ │
├─────────┤
│ D │ ← top
├─────────┤
│ C │
├─────────┤
│ B │
├─────────┤
│ A │
└─────────┘
pop() → returns E returns top and updates it (removes top)
push() and pop(), others?Write up a generic stack interface
public interface Stack<T> {
/**
* Stack is LIFO – Last In, First Ou
* add a new value (with T data) to the top of the stack
* @param data of generic type T
*/
void push(T data);
/**
* Removes and returns the value at the top of the stack
* @return the value stored in the node at the top of the stack
*/
T pop();
/**
* Looks at the value at the top of the stack without removing it
* @return the value stored in the node at the top of the stack
*/
T top();
/**
* @return true if Stack is empty, false otherwise
*/
boolean isEmpty();
}Problem: Write a program that checks if parentheses, brackets, and braces are properly balanced in a string.
Examples:
First In First Out
back ┌───┬───┬───┬───┐ front
─────▶│ D │ C │ B │ A │──────▶
└───┴───┴───┴───┘
enqueue(E)
adds to back
back ┌───┬───┬───┬───┬───┐ front
─────▶│ E │ D │ C │ B │ A │──────▶
└───┴───┴───┴───┴───┘
dequeue()
removes from front
back ┌───┬───┬───┬───┐ front returns A
─────▶│ D │ C │ B │ A │──────▶
└───┴───┴───┴───┘
│
▼ after dequeue
back ┌───┬───┬───┐ front
─────▶│ D │ C │ B │──────▶
└───┴───┴───┘
peek()
returns front, no removal
back ┌───┬───┬───┬───┐ front
─────▶│ D │ C │ B │ A │──────▶
└───┴───┴───┴───┘
returns A
does NOT
remove it
enqueue() (adds to the end of the queue)dequeue() (removes from the beginning of the queue)Write up a generic queue interface
public interface Queue<T> {
/**
* Queue is First In, First Out
* @param data is the value to be added to the end of the queue
*/
void enqueue(T data);
/**
* Removes the value from the beginning of the queue and returns it
* @return the value of type T at the beginning of the queue
*/
T dequeue();
/**
* @return true if Queue is empty, false otherwise
*/
boolean isEmpty();
}Queue as a linked list vs. array implementation
head and tail like we did for our first Linked List implementation% operator to “wrap” around the array
count = array.lengthResizing?
0 1 2 3 4
┌───┬───┬───┬───┬───┐
│ │ │ A │ B │ │
└───┴───┴───┴───┴───┘
front index: 2
back index: 3
0 1 2 3 4
┌───┬───┬───┬───┬───┐
│ │ │ A │ B │ C │
└───┴───┴───┴───┴───┘
front index: 2
back index: 4
0 1 2 3 4
┌───┬───┬───┬───┬───┐
│ D │ │ A │ B │ C │
└───┴───┴───┴───┴───┘
front index: 2
back index: 0
0 1 2 3 4
┌───┬───┬───┬───┬───┐
│ D │ │ │ B │ C │
└───┴───┴───┴───┴───┘
front index: 3
back index: 0
0 1 2 3 4
┌───┬───┬───┬───┬───┐
│ D │ E │ │ B │ C │
└───┴───┴───┴───┴───┘
front index: 3
back index: 1