Python: Data Structures 2

Main Python Data Structures Playlist

Contents

Stacks: Using List, OOP, deque

Learn how to implement stacks in Python using lists, OOP, and deque from collections.

# Stack using list
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop())
print(stack)

# Stack OOP
class Stack:
    def __init__(self):
        self.items = []
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.items.pop() if self.items else None
    def peek(self):
        return self.items[-1] if self.items else None
    def is_empty(self):
        return not self.items
    def size(self):
        return len(self.items)
s = Stack()
s.push(10)
s.push(20)
print(s.pop())
print(s.peek())

# Stack using deque
from collections import deque
d = deque()
d.append('a')
d.append('b')
print(d.pop())
print(d)

Queues: Using List, OOP

Implement queues in Python using lists and OOP.

# Queue using list
queue = []
queue.append(1)
queue.append(2)
queue.append(3)
print(queue.pop(0))
print(queue)

# Queue OOP
class Queue:
    def __init__(self):
        self.items = []
    def enqueue(self, item):
        self.items.append(item)
    def dequeue(self):
        return self.items.pop(0) if self.items else None
    def is_empty(self):
        return not self.items
    def size(self):
        return len(self.items)
q = Queue()
q.enqueue(10)
q.enqueue(20)
print(q.dequeue())
print(q.items)

Linked Lists: Basic, OOP, Single, Double, Circular

Explore linked lists in Python: basic, OOP, singly, doubly, and circular linked lists.

# Singly Linked List Node
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

# Singly Linked List
class LinkedList:
    def __init__(self):
        self.head = None
    def append(self, data):
        new = Node(data)
        if not self.head:
            self.head = new
            return
        curr = self.head
        while curr.next:
            curr = curr.next
        curr.next = new
    def print_list(self):
        curr = self.head
        while curr:
            print(curr.data, end=' -> ')
            curr = curr.next
        print('None')
ll = LinkedList()
ll.append(1)
ll.append(2)
ll.append(3)
ll.print_list()

# Doubly Linked List Node
class DNode:
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None

# Doubly Linked List
class DoublyLinkedList:
    def __init__(self):
        self.head = None
    def append(self, data):
        new = DNode(data)
        if not self.head:
            self.head = new
            return
        curr = self.head
        while curr.next:
            curr = curr.next
        curr.next = new
        new.prev = curr
    def print_list(self):
        curr = self.head
        while curr:
            print(curr.data, end=' <-> ')
            curr = curr.next
        print('None')
dl = DoublyLinkedList()
dl.append(1)
dl.append(2)
dl.append(3)
dl.print_list()

# Circular Linked List
class CNode:
    def __init__(self, data):
        self.data = data
        self.next = None
class CircularLinkedList:
    def __init__(self):
        self.head = None
    def append(self, data):
        new = CNode(data)
        if not self.head:
            self.head = new
            new.next = new
            return
        curr = self.head
        while curr.next != self.head:
            curr = curr.next
        curr.next = new
        new.next = self.head
    def print_list(self):
        curr = self.head
        if not curr:
            return
        while True:
            print(curr.data, end=' -> ')
            curr = curr.next
            if curr == self.head:
                break
        print('(head)')
cll = CircularLinkedList()
cll.append(1)
cll.append(2)
cll.append(3)
cll.print_list()

Binary Trees (Playlist)

Learn about binary trees in Python. This is a playlist covering all major tree topics.

# Binary Tree Node
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def inorder(root):
    if root:
        inorder(root.left)
        print(root.val, end=' ')
        inorder(root.right)

def preorder(root):
    if root:
        print(root.val, end=' ')
        preorder(root.left)
        preorder(root.right)

def postorder(root):
    if root:
        postorder(root.left)
        postorder(root.right)
        print(root.val, end=' ')

# Build a tree
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

print('Inorder:')
inorder(root)
print('\nPreorder:')
preorder(root)
print('\nPostorder:')
postorder(root)