在计算机科学中,数据结构是处理数据的一种方式,它决定了数据在计算机中的存储方式以及数据之间的关系。掌握数据结构对于编程来说至关重要,因为它不仅影响代码的效率,还能帮助我们更好地理解问题。本文将提供一系列实战任务,帮助你深入理解各种数据结构,并通过实际操作提升你的编程技能。

一、线性数据结构

1. 数组

任务描述:实现一个动态数组,支持插入、删除、查找和排序操作。

代码示例

class DynamicArray:
    def __init__(self):
        self.capacity = 1
        self.size = 0
        self.array = [None] * self.capacity

    def insert(self, index, value):
        if index < 0 or index > self.size:
            raise IndexError("Index out of bounds")
        if self.size == self.capacity:
            self._resize(2 * self.capacity)
        for i in range(self.size, index, -1):
            self.array[i] = self.array[i - 1]
        self.array[index] = value
        self.size += 1

    def delete(self, index):
        if index < 0 or index >= self.size:
            raise IndexError("Index out of bounds")
        value = self.array[index]
        for i in range(index, self.size - 1):
            self.array[i] = self.array[i + 1]
        self.array[self.size - 1] = None
        self.size -= 1
        if self.size <= self.capacity // 4:
            self._resize(self.capacity // 2)
        return value

    def _resize(self, new_capacity):
        new_array = [None] * new_capacity
        for i in range(self.size):
            new_array[i] = self.array[i]
        self.array = new_array
        self.capacity = new_capacity

    def find(self, value):
        for i in range(self.size):
            if self.array[i] == value:
                return i
        return -1

    def sort(self):
        for i in range(self.size):
            for j in range(i + 1, self.size):
                if self.array[i] > self.array[j]:
                    self.array[i], self.array[j] = self.array[j], self.array[i]

2. 链表

任务描述:实现一个双向链表,支持插入、删除、查找和排序操作。

代码示例

class Node:
    def __init__(self, value):
        self.value = value
        self.prev = None
        self.next = None

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def insert(self, value, index=0):
        new_node = Node(value)
        if index == 0:
            if self.head is None:
                self.head = self.tail = new_node
            else:
                new_node.next = self.head
                self.head.prev = new_node
                self.head = new_node
        elif index == self.size():
            new_node.prev = self.tail
            self.tail.next = new_node
            self.tail = new_node
        else:
            current = self.head
            for _ in range(index):
                current = current.next
            new_node.prev = current.prev
            new_node.next = current
            current.prev.next = new_node
            current.prev = new_node
        self.size += 1

    def delete(self, index):
        if index < 0 or index >= self.size():
            raise IndexError("Index out of bounds")
        current = self.head
        for _ in range(index):
            current = current.next
        if current.prev:
            current.prev.next = current.next
        if current.next:
            current.next.prev = current.prev
        if current == self.head:
            self.head = current.next
        if current == self.tail:
            self.tail = current.prev
        self.size -= 1
        return current.value

    def find(self, value):
        current = self.head
        for _ in range(self.size()):
            if current.value == value:
                return current
            current = current.next
        return None

    def sort(self):
        sorted_list = []
        current = self.head
        while current:
            sorted_list.append(current.value)
            current = current.next
        sorted_list.sort()
        current = self.head
        for value in sorted_list:
            current.value = value
            current = current.next

    def size(self):
        current = self.head
        count = 0
        while current:
            count += 1
            current = current.next
        return count

二、非线性数据结构

1. 树

任务描述:实现一个二叉搜索树(BST),支持插入、删除、查找和排序操作。

代码示例

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

class BinarySearchTree:
    def __init__(self):
        self.root = None

    def insert(self, value):
        if self.root is None:
            self.root = TreeNode(value)
        else:
            self._insert_recursive(self.root, value)

    def _insert_recursive(self, current, value):
        if value < current.value:
            if current.left is None:
                current.left = TreeNode(value)
            else:
                self._insert_recursive(current.left, value)
        else:
            if current.right is None:
                current.right = TreeNode(value)
            else:
                self._insert_recursive(current.right, value)

    def delete(self, value):
        self.root = self._delete_recursive(self.root, value)

    def _delete_recursive(self, current, value):
        if current is None:
            return None
        if value < current.value:
            current.left = self._delete_recursive(current.left, value)
        elif value > current.value:
            current.right = self._delete_recursive(current.right, value)
        else:
            if current.left is None:
                return current.right
            elif current.right is None:
                return current.left
            else:
                min_larger_node = self._find_min(current.right)
                current.value = min_larger_node.value
                current.right = self._delete_recursive(current.right, min_larger_node.value)
        return current

    def _find_min(self, current):
        while current.left is not None:
            current = current.left
        return current

    def find(self, value):
        return self._find_recursive(self.root, value)

    def _find_recursive(self, current, value):
        if current is None:
            return None
        if value < current.value:
            return self._find_recursive(current.left, value)
        elif value > current.value:
            return self._find_recursive(current.right, value)
        else:
            return current

    def inorder_traversal(self):
        result = []
        self._inorder_recursive(self.root, result)
        return result

    def _inorder_recursive(self, current, result):
        if current:
            self._inorder_recursive(current.left, result)
            result.append(current.value)
            self._inorder_recursive(current.right, result)

2. 图

任务描述:实现一个图数据结构,支持添加边、删除边、查找最短路径和拓扑排序操作。

代码示例

class Graph:
    def __init__(self):
        self.adjacency_list = {}

    def add_edge(self, vertex1, vertex2, weight=0):
        if vertex1 not in self.adjacency_list:
            self.adjacency_list[vertex1] = []
        if vertex2 not in self.adjacency_list:
            self.adjacency_list[vertex2] = []
        self.adjacency_list[vertex1].append((vertex2, weight))
        self.adjacency_list[vertex2].append((vertex1, weight))

    def remove_edge(self, vertex1, vertex2):
        if vertex1 in self.adjacency_list and vertex2 in self.adjacency_list[vertex1]:
            self.adjacency_list[vertex1].remove((vertex2, 0))
        if vertex2 in self.adjacency_list and vertex1 in self.adjacency_list[vertex2]:
            self.adjacency_list[vertex2].remove((vertex1, 0))

    def shortest_path(self, start, end):
        distances = {vertex: float('infinity') for vertex in self.adjacency_list}
        distances[start] = 0
        priority_queue = [(0, start)]
        while priority_queue:
            current_distance, current_vertex = heappop(priority_queue)
            if current_distance > distances[current_vertex]:
                continue
            for neighbor, weight in self.adjacency_list[current_vertex]:
                distance = current_distance + weight
                if distance < distances[neighbor]:
                    distances[neighbor] = distance
                    priority_queue.append((distance, neighbor))
        return distances[end]

    def topological_sort(self):
        in_degree = {vertex: 0 for vertex in self.adjacency_list}
        for edges in self.adjacency_list.values():
            for edge in edges:
                in_degree[edge[0]] += 1
        queue = [vertex for vertex in self.adjacency_list if in_degree[vertex] == 0]
        sorted_list = []
        while queue:
            vertex = queue.pop(0)
            sorted_list.append(vertex)
            for neighbor, _ in self.adjacency_list[vertex]:
                in_degree[neighbor] -= 1
                if in_degree[neighbor] == 0:
                    queue.append(neighbor)
        return sorted_list if len(sorted_list) == len(self.adjacency_list) else None

通过以上实战任务,你可以深入理解各种数据结构,并通过实际操作提升你的编程技能。记住,理论知识是基础,但实践才是检验真理的唯一标准。不断练习,相信你会在数据结构领域取得优异的成绩。