Stack
# lets look at the idea of another data structure
# a Stack like a stack of plates or books
# LIFO (last in first out)
# we can push items on to the stack
# we can pop items off a stack
# and we can peek at the item at the top of the stack
# think of how you could utilise a linked list to form a stack
"""
A stack is a data structure whose primary purpose is to store and
return elements in Last In First Out order.
1. Implement the Stack class using an array as the underlying storage structure.
Make sure the Stack tests pass.
2. Re-implement the Stack class, this time using the linked list implementation
as the underlying storage structure.
Make sure the Stack tests pass.
3. What is the difference between using an array vs. a linked list when
implementing a Stack?
"""
# Implement a Stack using an array for the underlying storage
class StackA:
def __init__(self):
self.storage = []
def __len__(self):
return len(self.storage)
def push(self, value):
self.storage.append(value)
def pop(self):
if len(self.storage) == 0:
return None
return self.storage.pop()
from linked_list import LinkedList
# Stack implementation using a Linked List
class StackL:
def __init__(self):
self.size = 0
self.storage = LinkedList()
def __len__(self):
return self.size
def push(self, value):
self.storage.add_to_head(value)
self.size += 1
def pop(self):
if self.size == 0:
return None
self.size -= 1
return self.storage.remove_head()Stack
Implementation of an interpreter for a small language that does multiplication/addition/etc.
Design a
MinStackdata structure that supports amin()operation that returns the minimum value in the stack in O(1) time.Write an algorithm to determine if all of the delimiters in an expression are matched and closed.
E.g.
{ac[bb]},[dklf(df(kl))d]{}and{[[[]]]}are matched. But{3234[fdand{df][d}are not.
Sort a stack in ascending order using an additional stack.
Stacks in Python
Stacks are a sequential data structure that act as the Last-in, First-out (LIFO) version of queues. The last element inserted in a stack is considered at the top of the stack and is the only accessible element. To access a middle element, you must first remove enough elements to make the desired element the top of the stack.
Many developers imagine stacks as a stack of dinner plates; you can add or remove plates to the top of the stack but must move the whole stack to place one at the bottom.
Adding elements is known as a push, and removing elements is known as a pop. You can implement stacks in Python using the built-in list structure. With list implementation, push operations use the append() method, and pop operations use pop().
Advantages:
Offers LIFO data management that’s impossible with arrays
Automatic scaling and object cleanup
Simple and reliable data storage system
Disadvantages:
Stack memory is limited
Too many objects on the stack leads to a stack overflow error
Applications:
Used for making highly reactive systems
Memory management systems use stacks to handle the most recent requests first
Helpful for questions like parenthesis matching
Common stacks interview questions in Python
Implement a queue using stacks
Evaluate a Postfix expression with a stack
Next greatest element using a stack
Create a
min()function using a stack
Stack in Python
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
A stack is a linear data structure that stores items in a Last-In/First-Out (LIFO) or First-In/Last-Out (FILO) manner. In stack, a new element is added at one end and an element is removed from that end only. The insert and delete operations are often called push and pop.
The functions associated with stack are:
empty() – Returns whether the stack is empty – Time Complexity: O(1)
size() – Returns the size of the stack – Time Complexity: O(1)
top() – Returns a reference to the topmost element of the stack – Time Complexity: O(1)
push(a) – Inserts the element ‘a’ at the top of the stack – Time Complexity: O(1)
pop() – Deletes the topmost element of the stack – Time Complexity: O(1)
Implementation
There are various ways from which a stack can be implemented in Python. This article covers the implementation of a stack using data structures and modules from the Python library. Stack in Python can be implemented using the following ways:
list
Collections.deque
queue.LifoQueue
Implementation using list:
Python’s built-in data structure list can be used as a stack. Instead of push(), append() is used to add elements to the top of the stack while pop() removes the element in LIFO order. Unfortunately, the list has a few shortcomings. The biggest issue is that it can run into speed issues as it grows. The items in the list are stored next to each other in memory, if the stack grows bigger than the block of memory that currently holds it, then Python needs to do some memory allocations. This can lead to some append() calls taking much longer than other ones.
Python3
Output:
Initial stack ['a', 'b', 'c']
Elements popped from stack: c b a
Stack after elements are popped: []
Traceback (most recent call last): File "/home/2426bc32be6a59881fde0eec91247623.py", line 25, in print(stack.pop()) IndexError: pop from empty list
Implementation using collections.deque:
Python stack can be implemented using the deque class from the collections module. Deque is preferred over the list in the cases where we need quicker append and pop operations from both the ends of the container, as deque provides an O(1) time complexity for append and pop operations as compared to list which provides O(n) time complexity. The same methods on deque as seen in the list are used, append() and pop().
Python3
Output:
Initial stack: deque(['a', 'b', 'c'])
Elements popped from stack: c b a
Stack after elements are popped: deque([])
Traceback (most recent call last): File "/home/97171a8f6fead6988ea96f86e4b01c32.py", line 29, in print(stack.pop()) IndexError: pop from an empty deque
Implementation using queue module
Queue module also has a LIFO Queue, which is basically a Stack. Data is inserted into Queue using the put() function and get() takes data out from the Queue.
There are various functions available in this module:
maxsize – Number of items allowed in the queue.
empty() – Return True if the queue is empty, False otherwise.
full() – Return True if there are maxsize items in the queue. If the queue was initialized with maxsize=0 (the default), then full() never returns True.
get() – Remove and return an item from the queue. If the queue is empty, wait until an item is available.
get_nowait() – Return an item if one is immediately available, else raise QueueEmpty.
put(item) – Put an item into the queue. If the queue is full, wait until a free slot is available before adding the item.
put_nowait(item) – Put an item into the queue without blocking.
qsize() – Return the number of items in the queue. If no free slot is immediately available, raise QueueFull.
Python3
Python3
Output:
0 Full: True Size: 3
Elements popped from the stack c b a
Empty: True
Implementation using singly linked list:
The linked list has two methods addHead(item) and removeHead() that run in constant time. These two methods are suitable to implement a stack.
getSize()– Get the number of items in the stack.
isEmpty() – Return True if the stack is empty, False otherwise.
peek() – Return the top item in the stack. If the stack is empty, raise an exception.
push(value) – Push a value into the head of the stack.
pop() – Remove and return a value in the head of the stack. If the stack is empty, raise an exception.
Below is the implementation of the above approach:
Python3
Output:
Stack: 10 -> 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1
Pop: 10 Pop: 9 Pop: 8 Pop: 7 Pop: 6
Stack: 5 -> 4 -> 3 -> 2 -> 1
ArrayBinary Search TreeLinked ListExtra-ArrayStackBinary TreeRecursionHash TableSearchingSortingQueue SandboxHash TableDouble Linked ListGraphsExoticHeapLast updated
Was this helpful?