C++中队列queue的用法实例详解

C++中队列queue的用法实例详解

什么是队列

队列是一种线性数据结构,具有“先进先出”的特点。队列只允许在队尾插入元素,在队头删除元素。队列的常见操作包括入队(enqueue)、出队(dequeue)、获取队头元素(front)和获取队尾元素(back)。队列的实现可以使用数组或链表等数据结构。

C++中队列queue的使用

在C++ STL中,队列(queue)是一种容器适配器。它基于deque实现,提供了队列的常见操作。使用queue需要包含头文件<queue>

创建一个空队列

可以使用默认构造函数创建一个空队列:

queue<int> q;

这将创建一个空的int类型的队列。

将元素入队

可以使用push方法将元素加入队列的尾部:

q.push(1); // 将1加入队尾
q.push(2);
q.push(3);

获取队头元素

可以使用front方法获取队列头部元素的值,但是不会将其从队列中删除:

int x = q.front(); // 获取队头元素的值

将元素出队

可以使用pop方法将队头元素删除:

q.pop(); // 删除队头元素

获取队列的长度

可以使用size方法获取队列的长度:

int size = q.size(); // 获取队列的长度

判断队列是否为空

可以使用empty方法判断队列是否为空:

bool is_empty = q.empty(); // 判断队列是否为空

队列实例演示

以下是两个队列的实例:

实例1:使用队列求解迷宫问题

迷宫问题是一类经典的搜索问题,可以使用队列进行求解。假设有一个$n\times m$的迷宫,用二维数组表示,0表示墙,1表示路。现在给定起点和终点的坐标,求从起点到终点的最短距离。

#include <bits/stdc++.h>
using namespace std;

const int N = 1010;

int n, m, sx, sy, ex, ey; // n是行数,m是列数

int g[N][N], d[N][N]; // g存储迷宫,d记录到起点的步数

int bfs() {
    queue<pair<int, int>> q;
    q.push({sx, sy}); // 将起点入队
    memset(d, -1, sizeof d);
    d[sx][sy] = 0;
    while (!q.empty()) {
        auto t = q.front(); q.pop();
        int x = t.first, y = t.second;
        if (x == ex && y == ey) return d[x][y];
        for (int i = -1; i <= 1; ++ i)
            for (int j = -1; j <= 1; ++ j) {
                if (i != 0 && j != 0) continue; // 只考虑上下左右四个方向
                int nx = x + i, ny = y + j;
                if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && g[nx][ny] && d[nx][ny] == -1) {
                    d[nx][ny] = d[x][y] + 1; // 更新步数
                    q.push({nx, ny}); // 将相邻的合法点入队
                }
            }
    }
    return -1; // 无解
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++ i)
        for (int j = 1; j <= m; ++ j) {
            cin >> g[i][j];
            if (g[i][j] == 1) g[i][j] = 1; // 路
            else if (g[i][j] == 0) g[i][j] = 0; // 墙
            else if (g[i][j] == 2) { // 起点
                sx = i, sy = j;
                g[i][j] = 1;
            } else if (g[i][j] == 3) { // 终点
                ex = i, ey = j;
                g[i][j] = 1;
            }
        }
    cout << bfs() << endl; // 输出最短步数
    return 0;
}

在上述实例中,我们使用了一个pair类型的元素表示坐标,将坐标存储在队列中,实现了迷宫问题的求解。

实例2:使用队列实现栈

虽然队列和栈是两种不同的数据结构,但是我们可以利用队列实现栈。具体实现方式是利用两个队列,一个队列存储栈中的元素,另一个队列用于辅助操作。

#include <bits/stdc++.h>
using namespace std;

class MyStack {
public:
    queue<int> q1, q2;

    void push(int x) {
        q1.push(x); // 将元素加入队列1
    }

    int pop() {
        while (q1.size() > 1) { // 将队列1中前n-1个元素转移到队列2中
            int x = q1.front(); q1.pop();
            q2.push(x);
        }
        int x = q1.front(); q1.pop(); // 取出队列1中的最后一个元素
        swap(q1, q2); // 交换队列1和队列2
        return x; // 返回出队元素的值
    }

    int top() {
        int x = pop(); // 先将出队元素取出
        push(x); // 再将出队元素加回队列
        return x; // 返回出队元素的值
    }

    bool empty() {
        return q1.empty(); // 判断队列1是否为空
    }
};

int main() {
    MyStack s;
    s.push(1);
    s.push(2);
    s.push(3);
    cout << s.top() << endl; // 输出3
    cout << s.pop() << endl; // 输出3
    cout << s.top() << endl; // 输出2
    cout << s.empty() << endl; // 输出0
    return 0;
}

在上述实例中,我们使用两个队列实现了一个栈,其关键是将队列1中前$n-1$个元素转移到队列2中,并取出队列1中的最后一个元素,从而实现出栈。同时,我们在出栈完成后将元素重新加入到队列1中,保证队列中元素的顺序不变。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中队列queue的用法实例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 电脑高手常用技巧应用全接解

    电脑高手常用技巧应用全接解 作为一名电脑高手,掌握一些常用技巧可以帮助我们更加高效地使用电脑。以下是电脑高手常用技巧应用全接解的详细攻略: 一、清理系统垃圾 随着我们在电脑上进行各种操作,系统会产生大量垃圾文件,日积月累会占用相当大的磁盘空间,导致电脑运行变慢。因此,我们需要定期清理系统垃圾。 在Windows系统中,可以通过以下步骤清理系统垃圾: 打开“我…

    other 2023年6月25日
    00
  • 详解SpringBoot之访问静态资源(webapp…)

    下面是详解SpringBoot之访问静态资源(webapp…)的完整攻略: 1. 在SpringBoot中访问静态资源 SpringBoot中默认的静态资源路径为classpath:/static/。 在该路径下,可以放置各种静态资源,例如HTML页面、CSS样式表、JavaScript脚本等等。 2. 访问HTML页面 要访问一个HTML页面,只需要将…

    other 2023年6月27日
    00
  • vue.js实现的绑定class操作示例

    Vue.js实现绑定class操作示例攻略 1. 简介 Vue.js是一款流行的JavaScript框架,提供了便捷的数据绑定和视图渲染功能。其中,绑定class是Vue.js的一个重要特性,可以根据数据的变化动态地添加或移除HTML元素的class。 本攻略将详细讲解如何使用Vue.js实现绑定class操作,并提供两个示例说明。 2. 示例说明 示例一:…

    other 2023年6月28日
    00
  • C语言各种操作符透彻理解上篇

    下面我就来详细讲解一下“C语言各种操作符透彻理解上篇”的完整攻略。 一、认识C语言各种操作符 在C语言中,操作符是用来对变量或者常量进行操作或运算的标识符。C语言中的操作符可以分为以下几类: 算术操作符:加(+)、减(-)、乘(*)、除(/)、取模(%)等。 关系操作符:等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)…

    other 2023年6月27日
    00
  • 详解Linux系统三种模式下的简单命令

    详解Linux系统三种模式下的简单命令 一、用户模式 1. 命令行操作 在Linux的用户模式下,我们可以通过命令行来操作系统。下面是一些常用的命令: ls: 列出当前目录下的所有文件和文件夹。 cd: 进入指定的目录。比如,如果你想进入 /home 目录,可以输入 cd /home。 mkdir: 创建一个新的文件夹。 比如,如果你想创建一个名为 test…

    other 2023年6月26日
    00
  • Spring mvc服务端数据校验实现流程详解

    Spring MVC 是一个轻量级的Web框架,提供了简化Web应用开发的一系列组件和功能,其中服务端数据校验是其中一个重要的功能。 本文将详细讲解Spring MVC服务端数据校验的实现流程,并提供两个示例。 什么是服务端数据校验? 服务端数据校验,顾名思义,就是在服务端对用户提交的数据进行校验,以保证数据的有效性、完整性和正确性。 在前后端分离的项目中,…

    other 2023年6月27日
    00
  • Linux/Unix操作系统目录结构的来历

    Linux/Unix操作系统目录结构的来历: Linux/Unix操作系统目录结构的设计最初是基于多用户,多任务的操作系统。在早期的操作系统中,只有很少的目录和文件需要进行管理,但是随着操作系统的发展,需要管理的目录和文件数量不断增加,这就需要一种更为完善的结构来管理这些文件和目录。而Linux/Unix操作系统目录结构的设计正是为了应对这一需求而产生的。 …

    other 2023年6月27日
    00
  • Go 使用xorm操作mysql详情

    下面是 “Go 使用xorm操作mysql详情” 的完整攻略: 安装xorm xorm是一个Go语言实现的ORM库,可用于操作多种关系型数据库,下面是安装xorm: go get xorm.io/xorm 创建并配置数据库连接信息 在Go中,我们可以使用xorm自带的数据库连接池和ORM模块来连接MySQL。 下面是一个示例代码,其中包含了数据库连接配置、创…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部