hello算法
1.数组是连续存储,因此可以利用一个开始节点的地址直接确定其他的节点地址。
2.链表未绑定的存储顺序,具有更灵活快捷的增删改查。
3.为了解决存储的问题,数组发展了动态数组的概念。
总结:
1.栈是一种先入后出的数据结构,类似于“铁饼堆叠游戏”。
2.队列是一种先入先出的数据结构,类似于“数据进入不能回头的管道”。
stack库:
#include
// 声明队列
std::stack<Type> stack;
/* 初始化栈 */
stack<int> stack;
/* 元素入栈 */
stack.push(1);
/* 访问栈顶元素 */
int top = stack.top();
/* 元素出栈 */
stack.pop(); // 无返回值
/* 获取栈的长度 */
int size = stack.size();
/* 判断是否为空 */
bool empty = stack.empty();
queue库:
#include
// 声明队列
std::queue<Type> queue;
//定义一个队列
queue<int> queue;
// 元素入队
queue.push(1);
/* 访问队首元素 */
int front = queue.front();
/* 元素出队 */
queue.pop();
/* 获取队列的长度 */
int size = queue.size();
/* 判断队列是否为空 */
bool empty = queue.empty();
下面列举了一些常见的应用场景:
函数调用和返回:
表达式求值:
括号匹配:
撤销操作:
浏览器历史记录:
递归调用:
回溯算法:
任务调度:
消息队列:
打印机队列:
缓冲区:
事件处理:
缓存管理:
广度优先搜索 (BFS):
下面是一个简单的示例,展示了栈和队列在解决实际问题中的应用:
#include
#include
#include
bool isValidParentheses(const std::string& s) {
std::stack<char> stack;
for (char c : s) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else if (!stack.empty()) {
char top = stack.top();
if ((c == ')' && top == '(') ||
(c == ']' && top == '[') ||
(c == '}' && top == '{')) {
stack.pop();
} else {
return false;
}
} else {
return false;
}
}
return stack.empty();
}
int main() {
std::string s = "{[()]}";
std::cout << "Is valid: " << (isValidParentheses(s) ? "Yes" : "No") << std::endl;
return 0;
}
假设我们有一个简单的图,使用邻接列表表示:
#include
#include
#include
#include
void bfs(const std::vector<std::vector<int>>& graph, int start) {
std::queue<int> q;
std::unordered_set<int> visited;
q.push(start);
visited.insert(start);
while (!q.empty()) {
int node = q.front();
q.pop();
std::cout << "Visited " << node << std::endl;
for (int neighbor : graph[node]) {
if (visited.find(neighbor) == visited.end()) {
q.push(neighbor);
visited.insert(neighbor);
}
}
}
}
int main() {
std::vector<std::vector<int>> graph = {
{1, 2},
{0},
{0, 3},
{2}
};
bfs(graph, 0);
return 0;
}
这些例子展示了栈和队列在不同领域的应用。根据具体问题的特点,可以选择合适的数据结构来解决问题。如果你有更具体的问题或需要进一步的帮助,请随时告诉我!