## stacks and queues
### stacks
* last in, first out structures (LIFO) * useful in certain recursive algorithms, where you can push temp data as you recurse, and remove them from the (memory or data structure) stack as you backtrace.
---- ### queues
* first in, first out structures (FIFO), i.e., items are removed at the same order they are added. * queues can be implemented with two arrays or a dynamic array (linked list), as long as items are added and removed from opposite sides. * if implemented with a dynamic array, a more efficient solution is to use a circular queue (ring buffer), i.e. a fixed-size array and two pointers to indicate the starting and ending positions. an advantage of circular queues is that we can use the spaces in front of the queue. in a normal queue, once the queue becomes full, we cannot insert the next element even if there is a space in front of the queue. but using the circular queue, we can use the space to store new values. * queues are often used in breath-first search (where you store a list of nodes to be processed) or when implementing a cache.
---- ### `Queues.py`
```python > python3 queues.py 🧪 Testing Queue... Is the queue empty? True Adding 1 to 10 in the queue... Queue: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] Queue size: 10 Queue peek : 1 Is the queue empty? False Dequeue... Queue: [10, 9, 8, 7, 6, 5, 4, 3, 2] Queue size: 9 Queue peek: 2 Is the queue empty? False 🧪 Testing Priority Queue... Priority Queue: [(-4, 1, Item 4), (-1, 0, Item 1), (-3, 2, Item 3)] Pop: Item 4 Priority Queue: [(-3, 2, Item 3), (-1, 0, Item 1)] ```
### `stack.py`
```python python3 stack.py Testing Stack... Stack: [12, 13, 14, 15, 16, 17, 18, 19, 20] Stack size: 9 Stack peek: 20 Stack is empty: False Stack min: 12 Popping... 20 19 18 17 16 Stack: [12, 13, 14, 15] ```