引言

数据结构是计算机科学中一个基础且重要的领域,它涉及到如何有效地存储、组织和访问数据。掌握数据结构对于理解算法和编写高效代码至关重要。本指南旨在通过一系列实战习题,帮助你轻松掌握数据结构,为即将到来的学习或工作做好准备。

1. 数据结构概述

1.1 数据结构定义

数据结构是一种用于存储、组织、管理和访问数据的特定方式。它不仅包括数据的存储方式,还包括对数据的操作。

1.2 常见数据结构

  • 数组:线性数据结构,用于存储具有相同数据类型的元素序列。
  • 链表:线性或非线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。
  • :后进先出(LIFO)的数据结构,适用于处理程序中的函数调用和表达式求值。
  • 队列:先进先出(FIFO)的数据结构,适用于任务调度和资源分配。
  • :非线性数据结构,由节点组成,每个节点有零个或多个子节点。
  • :由节点和边组成,用于表示对象及其之间的关系。

2. 实战习题集

2.1 数组

习题1:编写一个函数,实现两个整数的加法,不使用加减乘除运算符。

def add_without_operator(a, b):
    while b != 0:
        carry = a & b
        a = a ^ b
        b = carry << 1
    return a

2.2 链表

习题2:实现一个链表,包括插入、删除和查找元素的功能。

class ListNode:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next

class LinkedList:
    def __init__(self):
        self.head = None
    
    def insert(self, value):
        new_node = ListNode(value)
        if not self.head:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node
    
    def delete(self, value):
        current = self.head
        previous = None
        while current and current.value != value:
            previous = current
            current = current.next
        if current is None:
            return False
        if previous is None:
            self.head = current.next
        else:
            previous.next = current.next
        return True
    
    def find(self, value):
        current = self.head
        while current:
            if current.value == value:
                return True
            current = current.next
        return False

2.3 栈

习题3:实现一个后缀表达式计算器。

def calculate_suffix_expression(expression):
    stack = []
    operators = {'+': lambda a, b: a + b, '-': lambda a, b: a - b, '*': lambda a, b: a * b, '/': lambda a, b: a // b}
    for token in expression.split():
        if token in operators:
            b = stack.pop()
            a = stack.pop()
            stack.append(operators[token](a, b))
        else:
            stack.append(int(token))
    return stack[-1]

2.4 队列

习题4:实现一个循环队列。

class CircularQueue:
    def __init__(self, capacity):
        self.capacity = capacity
        self.queue = [None] * capacity
        self.head = self.tail = -1
    
    def is_empty(self):
        return self.head == -1
    
    def is_full(self):
        return (self.tail + 1) % self.capacity == self.head
    
    def enqueue(self, value):
        if self.is_full():
            raise Exception("Queue is full")
        if self.is_empty():
            self.head = 0
        self.tail = (self.tail + 1) % self.capacity
        self.queue[self.tail] = value
    
    def dequeue(self):
        if self.is_empty():
            raise Exception("Queue is empty")
        value = self.queue[self.head]
        if self.head == self.tail:
            self.head = self.tail = -1
        else:
            self.head = (self.head + 1) % self.capacity
        return value

2.5 树

习题5:实现一个二叉搜索树,包括插入、查找和删除节点。

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

class BinarySearchTree:
    def __init__(self):
        self.root = None
    
    def insert(self, value):
        if not self.root:
            self.root = TreeNode(value)
        else:
            self._insert(self.root, value)
    
    def _insert(self, node, value):
        if value < node.value:
            if not node.left:
                node.left = TreeNode(value)
            else:
                self._insert(node.left, value)
        else:
            if not node.right:
                node.right = TreeNode(value)
            else:
                self._insert(node.right, value)
    
    def find(self, value):
        return self._find(self.root, value)
    
    def _find(self, node, value):
        if not node:
            return None
        if value == node.value:
            return node
        elif value < node.value:
            return self._find(node.left, value)
        else:
            return self._find(node.right, value)
    
    def delete(self, value):
        self.root = self._delete(self.root, value)
    
    def _delete(self, node, value):
        if not node:
            return None
        if value < node.value:
            node.left = self._delete(node.left, value)
        elif value > node.value:
            node.right = self._delete(node.right, value)
        else:
            if not node.left:
                return node.right
            elif not node.right:
                return node.left
            else:
                min_larger_node = self._find_min(node.right)
                node.value = min_larger_node.value
                node.right = self._delete(node.right, min_larger_node.value)
        return node
    
    def _find_min(self, node):
        while node.left:
            node = node.left
        return node

2.6 图

习题6:实现一个图的数据结构,包括添加边、添加顶点、查找最短路径等功能。

class Graph:
    def __init__(self):
        self.vertices = {}
    
    def add_vertex(self, key):
        if key not in self.vertices:
            self.vertices[key] = []
    
    def add_edge(self, key1, key2):
        if key1 in self.vertices and key2 in self.vertices:
            self.vertices[key1].append(key2)
            self.vertices[key2].append(key1)
    
    def shortest_path(self, start, end):
        distances = {vertex: float('infinity') for vertex in self.vertices}
        distances[start] = 0
        previous_vertices = {vertex: None for vertex in self.vertices}
        vertices = list(self.vertices.keys())
        while vertices:
            current_vertex = None
            min_distance = float('infinity')
            for vertex in vertices:
                if distances[vertex] < min_distance:
                    min_distance = distances[vertex]
                    current_vertex = vertex
            if current_vertex is None:
                break
            if current_vertex == end:
                break
            vertices.remove(current_vertex)
            for neighbor in self.vertices[current_vertex]:
                alt = distances[current_vertex] + 1
                if alt < distances[neighbor]:
                    distances[neighbor] = alt
                    previous_vertices[neighbor] = current_vertex
        path, current_vertex = [], end
        while previous_vertices[current_vertex] is not None:
            path.insert(0, current_vertex)
            current_vertex = previous_vertices[current_vertex]
        if path:
            path.insert(0, current_vertex)
        return path

3. 总结

通过本指南提供的实战习题集,你可以系统地学习和掌握数据结构。通过实践,你将更好地理解数据结构的原理和应用,为将来的学习和工作打下坚实的基础。祝你学习愉快!