day38-栈和队列理论学习【c++】

day38-栈和队列理论学习【c++】

在 C++ 中,栈(Stack)和队列(Queue)是两种常见的数据结构,它们分别以不同的方式管理数据。下面是对它们的详细讲解,包括操作和代码实现。

栈(Stack)

定义:
栈是一种遵循“后进先出”(LIFO,Last In First Out)原则的数据结构。即,最新加入的元素最先被移除。

主要操作:

  1. push(): 将一个元素添加到栈顶。
  2. pop(): 移除栈顶的元素。
  3. top(): 获取栈顶的元素但不移除它。
  4. empty(): 判断栈是否为空。

C++ STL 中的栈实现:
在 C++ 标准模板库(STL)中,栈是通过 std::stack 实现的。默认情况下,它使用 std::deque 作为底层容器,但也可以使用 std::vectorstd::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)原则的数据结构。即,最早加入的元素最先被移除。

主要操作:

  1. enqueue()push(): 将一个元素添加到队列的尾部。
  2. dequeue()pop(): 从队列的头部移除元素。
  3. front(): 获取队列头部的元素但不移除它。
  4. back(): 获取队列尾部的元素但不移除它。
  5. 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 原则,支持的操作有 pushpoptopempty
  • 队列(Queue): 遵循 FIFO 原则,支持的操作有 pushpopfrontbackempty

这两种数据结构在许多算法和程序设计中都有广泛的应用,可以根据具体需要选择使用。


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了,就到这里叭~~~

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值