使用c++掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,写出迷宫问题的代码
时间: 2024-10-26 10:17:43 浏览: 19
数据结构C++ 顺序栈、链栈、循环队列、链队列的主要操作(Word文档含代码和注释)
5星 · 资源好评率100%
栈是一种线性数据结构,它遵循“后进先出”(Last In, First Out, LIFO)的原则。在C++中,栈可以使用数组(顺序存储)或链表(链接存储)两种方式进行实现。
**顺序存储栈**:
- **优点**: 内存连续,访问速度快(对于随机访问效率高),适合小规模数据和元素频繁进出的情况。
- **缺点**: 插入和删除操作需要移动大量元素(当栈顶接近数组容量时),效率较低。
- **基本操作**:
- `push(item)` : 入栈,将元素添加到栈顶。
- `pop()` : 出栈,移除并返回栈顶元素。
- `top()` : 查看栈顶元素但不移除。
- `empty()` : 检查栈是否为空。
- `size()` : 返回栈中元素的数量。
**链式存储栈**:
- **优点**: 插入和删除操作的时间复杂度为O(1),因为只需要修改指针即可,不受栈大小限制。
- **缺点**: 需要额外的指针指向当前栈顶,空间开销较大。
- **基本操作** 类似于顺序存储栈,只是操作涉及到对节点的操作,不需要移动元素。
关于迷宫问题,通常可以用深度优先搜索(DFS)或广度优先搜索(BFS)算法解决,其中栈常用于模拟路径搜索过程。下面是一个简单的用递归实现的迷宫求解思路:
```cpp
#include <iostream>
#include <stack>
// 定义一个二维布尔数组表示迷宫
bool maze[ROW][COL];
// 假设上、下、左、右四个方向可以移动
int directions[] = {0, 0, -1, 1};
void dfs(int x, int y) {
if (x < 0 || x >= ROW || y < 0 || y >= COL || maze[x][y] == false) return;
maze[x][y] = true; // 标记已过
std::stack<std::pair<int, int>> path; // 用堆栈保存路径
path.push({x, y});
while (!path.empty()) {
auto [current_x, current_y] = path.top(); path.pop();
std::cout << "visited (" << current_x << ", " << current_y << ") -> ";
for (auto dir : directions) {
int next_x = current_x + dir;
int next_y = current_y + directions[dir];
if (maze[next_x][next_y]) {
path.push({next_x, next_y});
}
}
}
}
int main() {
// 初始化迷宫矩阵...
dfs(start_x, start_y);
return 0;
}
```
阅读全文