# DataStructureVisualizer **Repository Path**: OftenStack/DataStructureVisualizer ## Basic Information - **Project Name**: DataStructureVisualizer - **Description**: 一个数据结构与算法的可视化教学工具 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-06-25 - **Last Updated**: 2025-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数据结构可视化工具 一个基于Qt6的C++数据结构可视化工具,支持多种数据结构和算法,具备代码生成和动画导出功能。 ## 🚀 功能特性 - **数据结构支持**:数组、链表、栈、队列、树、图 - **排序算法支持**:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序 - **查找算法支持**:线性查找、二分查找、插值查找 - **遍历算法支持**:深度优先搜索(DFS)、广度优先搜索(BFS)、中序遍历、前序遍历、后序遍历 - **智能匹配**:选择算法时自动匹配最佳数据结构,选择数据结构时过滤兼容算法 - **可视化功能**:3D可视化、动态演示算法执行过程 - **代码生成**:自动生成对应的C++代码 - **动画导出**:支持导出GIF等格式 - **性能分析**:详细的算法性能统计 ## 📖 使用指南 ### 智能匹配功能 本工具提供了智能的算法与数据结构匹配功能: #### 双向动态匹配 - **选择数据结构时**:算法下拉框会自动过滤,只显示与该数据结构兼容的算法 - **选择算法时**:数据结构树会自动选择与该算法最相适应的数据结构 #### 自动匹配规则 - **排序算法** → 自动选择"数组" - **查找算法** → 自动选择"数组" - **图遍历算法** → 自动选择"无向图" - **图最短路径算法** → 自动选择"加权图" - **栈相关算法** → 自动选择"栈" - **队列相关算法** → 自动选择"队列" - **动态规划算法** → 自动选择"数组" #### 使用建议 1. 可以先选择算法,系统会自动匹配最佳数据结构 2. 也可以先选择数据结构,系统会过滤出兼容的算法 3. 状态栏会显示当前的选择状态和匹配信息 ### 基本操作流程 1. **选择数据结构**:在左侧树形菜单中选择数据结构(或先选择算法自动匹配) 2. **选择算法**:在下拉菜单中选择算法(或先选择数据结构过滤算法) 3. **输入数据**:在文本框中输入要处理的数据 4. **设置参数**:配置算法参数和可视化选项 5. **开始可视化**:点击"开始"按钮观看算法执行过程 6. **生成代码**:点击"生成代码"查看对应的C++代码 7. **导出动画**:点击"导出动画"保存可视化过程 ## 📝 算法输入格式详解 ### 1. 排序算法 **支持的算法:** 冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序 **输入格式:** ``` 数字1 数字2 数字3 ... ``` **示例:** ``` 64 34 25 12 22 11 90 ``` **说明:** - 使用空格、逗号或换行分隔数字 - 支持正数、负数和零 - 建议输入5-20个数字以获得最佳可视化效果 ### 2. 查找算法 **支持的算法:** 线性查找、二分查找、插值查找 **输入格式:** ``` 数字1 数字2 数字3 ... ``` **查找目标:** 在"查找目标"输入框中输入要查找的数字 **示例:** ``` 输入数据:1 3 5 7 9 11 13 15 查找目标:7 ``` **重要说明:** - **二分查找和插值查找**要求输入数据必须是有序的(从小到大) - **线性查找**可以处理无序数据 - 建议输入10-30个数字 ### 3. 栈操作 **支持的操作:** push、pop、top、peek、duplicate、swap、rotate **输入格式:** **方式一:初始数据 + 操作序列** ``` 输入数据:1 2 3 操作序列:push 5; pop; push 8; top ``` **方式二:仅操作序列** ``` 操作序列:push 1; push 2; push 3; pop; push 4 ``` **操作语法:** - `push 数字` - 将数字压入栈顶 - `pop` - 弹出栈顶元素 - `top` 或 `peek` - 查看栈顶元素 - `duplicate` - 复制栈顶元素 - `swap` - 交换栈顶两个元素 - `rotate 数字` - 旋转栈顶指定数量的元素 **分隔符:** 使用分号(;)或中文分号(;)分隔操作 **示例:** ``` push 1; push 2; push 3; pop; push 4; top ``` ### 4. 括号匹配算法 **输入格式:** ``` 包含括号的表达式 ``` **示例:** ``` ((())) ``` ``` {[()]} ``` ``` (a + b) * (c + d) ``` **支持的括号类型:** - 圆括号:`()` - 方括号:`[]` - 大括号:`{}` **使用方法:** 1. 选择数据结构:栈 2. 选择算法:括号匹配 3. 在输入数据框中输入表达式 4. 点击开始 ### 5. 链表操作 **支持的操作:** 插入、删除、查找、反转 **输入格式:** ``` 数字1 数字2 数字3 ... ``` **操作说明:** - 程序会自动演示链表的构建过程 - 支持在指定位置插入和删除节点 - 提供链表反转功能 ### 6. 队列操作 **支持的操作:** 入队、出队、查看队首 **输入格式:** ``` 数字1 数字2 数字3 ... ``` **操作说明:** - 程序会演示先进先出(FIFO)的特性 - 支持循环队列和优先级队列 ### 7. 树遍历算法 **支持的遍历方式:** 前序遍历、中序遍历、后序遍历 **输入格式:** ``` 数字1 数字2 数字3 ... ``` **说明:** - 程序会自动构建二叉树 - 演示不同遍历方式的执行过程 - 支持二叉搜索树的构建 ### 8. 图遍历算法 **支持的算法:** 深度优先搜索(DFS)、广度优先搜索(BFS) **输入格式:** ``` 节点1 节点2 节点3 ... ``` **说明:** - 程序会自动构建图结构 - 演示DFS和BFS的遍历过程 - 支持有向图和无向图 ## 🎮 控制功能 ### 动画控制 - **开始/暂停**:控制动画播放 - **上一步/下一步**:逐步执行算法 - **重置**:重新开始动画 - **速度调节**:调整动画播放速度 ### 可视化选项 - **颜色说明**:不同颜色代表不同状态 - **步骤信息**:显示当前执行的步骤详情 - **性能统计**:显示比较次数、交换次数等统计信息 ## 🔧 高级功能 ### 代码生成 - 自动生成对应算法的C++代码 - 支持多种编程风格和注释 - 可自定义代码模板 ### 动画导出 - 支持导出GIF格式动画 - 可调节动画速度和帧率 - 支持自定义动画效果 ### 3D可视化 - 基于OpenGL的3D渲染 - 支持旋转、缩放、平移操作 - 实时光照和阴影效果 - 支持多种渲染模式 ## 💡 使用技巧 ### 最佳实践 1. **数据量控制**:建议输入5-30个数据元素,过多会影响可视化效果 2. **算法选择**:根据数据特点选择合适的算法 3. **速度调节**:复杂算法建议降低播放速度以便观察 4. **步骤控制**:使用逐步执行功能深入理解算法过程 ### 常见问题 1. **二分查找失败**:确保输入数据已排序 2. **栈操作错误**:检查操作语法是否正确 3. **括号匹配异常**:确保括号类型匹配 4. **动画卡顿**:减少数据量或降低播放速度 ## 🚀 快速开始 ### 用户 进入release文件夹,获取可直接双击运行的.exe文件 ### 开发者 #### 环境要求 - Windows 10/11 (64位) - MinGW 8.1.0 或更高 - CMake 3.16 或更高 - Qt 6.3.0 或更高(包含OpenGL模块) - OpenGL 3.3 或更高 #### 构建步骤 1. **构建项目** 运行 build.bat 2. **获取程序** 运行 运行程序.bat ## 📁 项目结构 ``` DataStructureVisualizer/ ├── src/ # 源代码 │ ├── main.cpp # 主程序入口 │ ├── mainwindow.cpp # 主窗口实现 │ ├── visualizer.cpp # 可视化组件 │ ├── codegenerator.cpp # 代码生成器 │ ├── animationexporter.cpp # 动画导出器 │ ├── structures/ # 数据结构实现 │ │ ├── array.cpp # 数组实现 │ │ ├── linkedlist.cpp # 链表实现 │ │ ├── stack.cpp # 栈实现 │ │ └── queue.cpp # 队列实现 │ └── algorithms/ # 算法实现 │ ├── sorting.cpp # 排序算法 │ ├── searching.cpp # 查找算法 │ └── traversal.cpp # 遍历算法 ├── include/ # 头文件 │ ├── mainwindow.h # 主窗口头文件 │ ├── visualizer.h # 可视化组件头文件 │ ├── codegenerator.h # 代码生成器头文件 │ ├── animationexporter.h # 动画导出器头文件 │ ├── structures/ # 数据结构头文件 │ │ ├── array.h # 数组头文件 │ │ ├── linkedlist.h # 链表头文件 │ │ ├── stack.h # 栈头文件 │ │ └── queue.h # 队列头文件 │ └── algorithms/ # 算法头文件 │ ├── sorting.h # 排序算法头文件 │ ├── searching.h # 查找算法头文件 │ └── traversal.h # 遍历算法头文件 ├── CMakeLists.txt # CMake配置 └── README.md # 项目说明 ``` ## 📊 算法性能对比 ### 排序算法复杂度 | 算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 | |------|----------------|----------------|------------|--------| | 冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 | | 选择排序 | O(n²) | O(n²) | O(1) | 不稳定 | | 插入排序 | O(n²) | O(n²) | O(1) | 稳定 | | 快速排序 | O(n log n) | O(n²) | O(log n) | 不稳定 | | 归并排序 | O(n log n) | O(n log n) | O(n) | 稳定 | | 堆排序 | O(n log n) | O(n log n) | O(1) | 不稳定 | ### 查找算法复杂度 | 算法 | 时间复杂度 | 空间复杂度 | 适用场景 | |------|------------|------------|----------| | 线性查找 | O(n) | O(1) | 无序数据 | | 二分查找 | O(log n) | O(1) | 有序数据 | | 插值查找 | O(log log n) | O(1) | 均匀分布的有序数据 | ## 🤝 贡献指南 欢迎提交Issue和Pull Request来改进这个项目! ## 输入格式说明 ### 图数据结构输入格式 程序支持三种图类型,每种图的输入格式如下: #### 1. 无向图 (UndirectedGraph) **格式:** `顶点1 顶点2` 或 `顶点1 顶点2 权重` **说明:** 每条边都是双向的,权重默认为1 **示例:** ``` 1 2 2 3 3 1 ``` 或带权重: ``` 1 2 5 2 3 3 3 1 2 ``` #### 2. 有向图 (DirectedGraph) **格式:** `起点 终点` 或 `起点 终点 权重` **说明:** 边有方向,从起点指向终点,权重默认为1 **示例:** ``` 1 2 2 3 3 1 ``` 或带权重: ``` 1 2 5 2 3 3 3 1 2 ``` #### 3. 加权图 (WeightedGraph) **格式:** `顶点1 顶点2 权重` **说明:** 必须提供权重,无向加权图 **示例:** ``` 1 2 5 2 3 3 3 1 2 1 3 4 ``` #### 输入规则 - **每行一条边**,用**空格**分隔 - **顶点编号**:使用整数(如1, 2, 3...) - **权重**:整数,默认为1 - **自动处理**: - 自环(如1 1)会被自动跳过 - 重复边会被自动跳过 - 顶点会自动创建 #### 实际测试示例 **简单三角形图:** ``` 1 2 2 3 3 1 ``` **带权重的复杂图:** ``` 1 2 5 2 3 3 3 4 2 4 1 4 1 3 1 2 4 6 ``` **注意事项:** - 确保顶点编号连续或合理 - 权重应该是正整数 - 程序会自动处理重复边和自环 - 对于无向图,`1 2` 和 `2 1` 被视为同一条边 ## 高级功能 本项目采用Eula许可证。