day38-栈和队列理论学习【c++】
在 C++ 中,栈(Stack)和队列(Queue)是两种常见的数据结构,它们分别以不同的方式管理数据。下面是对它们的详细讲解,包括操作和代码实现。
栈(Stack)
定义:
栈是一种遵循“后进先出”(LIFO,Last In First Out)原则的数据结构。即,最新加入的元素最先被移除。
主要操作:
- push(): 将一个元素添加到栈顶。
- pop(): 移除栈顶的元素。
- top(): 获取栈顶的元素但不移除它。
- empty(): 判断栈是否为空。
C++ STL 中的栈实现:
在 C++ 标准模板库(STL)中,栈是通过 std::stack
实现的。默认情况下,它使用 std::deque
作为底层容器,但也可以使用 std::vector
或 std::list
。
代码示例:
#include <iostream>
#include <stack>
int main() {
std::stack<int> s; // 创建一个空栈
s.push(1); // 将 1 压入栈中
s.push(2); // 将 2 压入栈中
s.push(3); // 将 3 压入栈中
std::cout << "栈顶元素: " << s.top() << std::endl; // 输出 3
s.pop(); // 移除栈顶元素 (3)
std::cout << "栈顶元素: " << s.top() << std::endl; // 输出 2
std::cout << "栈是否为空: " << (s.empty() ? "是" : "否") << std::endl; // 输出 否
return 0;
}
队列(Queue)
定义:
队列是一种遵循“先进先出”(FIFO,First In First Out)原则的数据结构。即,最早加入的元素最先被移除。
主要操作:
- enqueue() 或 push(): 将一个元素添加到队列的尾部。
- dequeue() 或 pop(): 从队列的头部移除元素。
- front(): 获取队列头部的元素但不移除它。
- back(): 获取队列尾部的元素但不移除它。
- empty(): 判断队列是否为空。
C++ STL 中的队列实现:
在 C++ 标准模板库(STL)中,队列是通过 std::queue
实现的。默认情况下,它使用 std::deque
作为底层容器,但也可以使用 std::list
。
代码示例:
#include <iostream>
#include <queue>
int main() {
std::queue<int> q; // 创建一个空队列
q.push(1); // 将 1 添加到队列中
q.push(2); // 将 2 添加到队列中
q.push(3); // 将 3 添加到队列中
std::cout << "队列头部元素: " << q.front() << std::endl; // 输出 1
q.pop(); // 移除队列头部元素 (1)
std::cout << "队列头部元素: " << q.front() << std::endl; // 输出 2
std::cout << "队列是否为空: " << (q.empty() ? "是" : "否") << std::endl; // 输出 否
return 0;
}
总结
- 栈(Stack): 遵循 LIFO 原则,支持的操作有
push
、pop
、top
和empty
。 - 队列(Queue): 遵循 FIFO 原则,支持的操作有
push
、pop
、front
、back
和empty
。
这两种数据结构在许多算法和程序设计中都有广泛的应用,可以根据具体需要选择使用。
peek()
操作
在数据结构中,peek()
是一种操作,用于访问(但不移除)数据结构中的元素。在不同的数据结构中,peek()
可能会有不同的具体含义。以下是 peek()
在一些常见数据结构中的使用说明:
1. 栈(Stack)
在栈中,peek()
通常用来访问栈顶的元素,而不改变栈的状态。它的行为类似于 top()
操作。
例子:
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
s.push(1);
s.push(2);
s.push(3);
std::cout << "栈顶元素: " << s.top() << std::endl; // 使用 top(),类似于 peek()
return 0;
}
2. 队列(Queue)
在队列中,peek()
通常用来访问队列头部的元素,而不改变队列的状态。它的行为类似于 front()
操作。
例子:
#include <iostream>
#include <queue>
int main() {
std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);
std::cout << "队列头部元素: " << q.front() << std::endl; // 使用 front(),类似于 peek()
return 0;
}
3. 优先队列(Priority Queue)
在优先队列中,peek()
用于访问优先队列中优先级最高的元素(通常是队列的顶部元素),而不移除它。它的行为类似于 top()
操作。
例子:
#include <iostream>
#include <queue>
int main() {
std::priority_queue<int> pq;
pq.push(1);
pq.push(5);
pq.push(3);
std::cout << "优先队列的最大元素: " << pq.top() << std::endl; // 使用 top(),类似于 peek()
return 0;
}
总结
- 栈:
peek()
相当于top()
,访问栈顶元素。 - 队列:
peek()
相当于front()
,访问队列头部元素。 - 优先队列:
peek()
相当于top()
,访问优先队列中优先级最高的元素。
在标准库中,peek()
并不是一个特定的函数名,而是一个通用的术语,用来描述访问数据结构中不移除元素的操作。在不同的数据结构中,它的具体函数名称可能会有所不同。
ok了,就到这里叭~~~
如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!
如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!
如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!