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

yizhihongxing

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日

相关文章

  • [Micropython]TPYBoard v10x拼插编程实验 点亮心形点阵

    Micropython TPYBoard v10x拼插编程实验 点亮心形点阵的完整攻略 本文将详细讲解如何使用Micropython和TPYBoard v10x拼插板点亮心形点阵。本文将包括以下内容: 心形点阵的介绍 TPYBoard v10x拼插板的介绍 Micropython的介绍 点亮心形点阵的实现 示例说明 心形点阵的介绍 心形点阵是一种常见的LED…

    other 2023年5月5日
    00
  • React 数据获取与性能优化详解

    React 数据获取与性能优化详解 React 是一个流行的前端 JavaScript 框架,React 应用程序通常需要从服务器获取数据,这些数据必须有效地更新视图,同时也需要优化性能,确保 React 应用程序的性能处于最佳状态。本篇文章将介绍在 React 中如何获取数据并进行性能优化的最佳实践。 数据获取 React 应用程序通常需要从 API 获取…

    other 2023年6月27日
    00
  • 12C新特性–Application Continuity

    12C新特性–Application Continuity的完整攻略 本文将为您提供12C新特性–Application Continuity的完整攻略,包括Application Continuity的概念、使用方法、优势和两个示例说明。 Application Continuity的概念 Application Continuity是Oracle 1…

    other 2023年5月6日
    00
  • parquet文件格式

    以下是关于Parquet文件格式的完整攻略: Parquet文件格式简介 Parquet是一种列式存储格式,它被广泛用于大数据处理和分析。Parquet文件格式可以提高数据的压缩率和查询效率,同时还支持多种编程语言和数据处理框架。 Parquet文件格式的优点 Parquet文件格式具有以下优点: 列式存储:Parquet文件格式将数据按列存储,而不是按行存…

    other 2023年5月6日
    00
  • Android Oss上传图片的使用示例

    Android OSS上传图片的使用示例 概述 阿里云对象存储服务(OSS)是阿里云提供的一种简单可靠、低成本、高可扩展性的数据存储服务。该服务基于阿里云的海量分布式存储基础设施,通过Internet提供安全、稳定、高效、低延迟的数据访问和上传下载服务。 本文将详细讲解如何在Android应用中使用阿里云OSS上传图片。 前置条件 阿里云AccessKey …

    other 2023年6月27日
    00
  • ASP.Net PlaceHolder、Panel等控件未实现INamingContainer,导致FindControl无效

    首先,ASP.NET控件实现了INamingContainer接口,则可以使用FindControl方法查找其内部的子控件。但是,如果某些控件未实现该接口,则会导致FindControl方法找不到子控件。其中,ASP.Net PlaceHolder、Panel等控件未实现INamingContainer接口,因此需要注意。 若想要解决FindControl无…

    other 2023年6月26日
    00
  • JavaScript判断IE版本型号

    当需要在JavaScript中判断Internet Explorer(IE)的版本型号时,可以使用不同的方法。以下是一种完整的攻略,其中包含两个示例说明。 方法一:使用条件注释 条件注释是一种只在特定版本的IE浏览器中执行代码的技术。通过检查特定的条件注释语句,我们可以确定IE的版本。 // 示例一:判断IE版本是否小于等于IE9 if (/*@cc_on!…

    other 2023年8月3日
    00
  • Mac下用Java调用c/c++的思路详解

    Mac下用Java调用c/c++的思路详解 简介 Java是一门便于开发和跨平台的编程语言,而c/c++是性能优异的编程语言,如何在Java程序中调用c/c++代码是很多开发人员所关注的问题。 本文将介绍在Mac环境下使用Java调用c/c++代码的思路,包括JNI技术、编写本地函数库和使用开源库等方法。 JNI技术 JNI是Java Native Inte…

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