牛客NC14661 简单的数据结构(deque双端队列)

题目描述

栗酱有一天在网上冲浪的时候发现了一道很有意思的数据结构题。

这个数据结构形如一个"长条形"的容器,一开始该容器是空的,有以下七种操作:

1 1 1 a a a:从前面插入一个元素 a a a

2 2 2:从前面删除一个元素

3 3 3 a a a:从后面插入一个元素 a a a

4 4 4:从后面删除一个元素

5 5 5:将整个容器头尾翻转

6 6 6:输出当前容器中元素的个数和所有元素

7 7 7:将所有元素从小到大排序

请你模拟这个数据结构的所有操作。

输入格式

第一行包含两个整数 n , m n, m n,m,其中:

n n n 表示容器中最多可以存储的元素个数(保证不会超过 n n n)

m m m 表示操作的总次数

接下来 m m m 行,每行表示一个操作,格式如上所述。所有操作保证合法(例如不会在容器为空时删除元素)。

特别地,操作 6 6 6 和 7 7 7 总共不会超过 10 10 10 次。

输出格式

每当执行一次操作 6 6 6,请输出两行:

第一行输出当前容器中元素的个数

第二行按照当前容器顺序输出所有元素(从头到尾),相邻元素之间用一个空格隔开,末尾不能有空格。

输入样例

cpp 复制代码
10 9
1 1
3 5
3 4
6
4
5
6
7
6

输出样例

cpp 复制代码
3
1 5 4
2
5 1
2
1 5

说明/提示

【数据范围】:

  • 1 ≤ n ≤ 50000 1 ≤ n ≤ 50000 1≤n≤50000

  • 1 ≤ m ≤ 200000 1 ≤ m ≤ 200000 1≤m≤200000

  • 所有插入的 a a a 满足 1 ≤ a ≤ 100000 1 ≤ a ≤ 100000 1≤a≤100000

提交链接

简单的数据结构

思路分析

deque 就是一个两头操作的队列。

  • 有头插,尾插:push_front()/push_back()
  • 有头删,尾删:pop_front()/pop_back()
  • 工作性算法:sort(排序),reverse(倒置)

✅ 操作 1:从前插入

cpp 复制代码
if (op == 1) {
    cin >> a;
    q.push_front(a);
}

插入到容器前端,时间复杂度 O ( 1 ) O(1) O(1)。

✅ 操作 2:从前删除

cpp 复制代码
else if (op == 2) {
    q.pop_front();
}

删除容器前端第一个元素,时间复杂度 O ( 1 ) O(1) O(1)。

✅ 操作 3:从后插入

cpp 复制代码
else if (op == 3) {
    cin >> a;
    q.push_back(a);
}

插入到容器末尾,时间复杂度 O ( 1 ) O(1) O(1)。

✅ 操作 4:从后删除

cpp 复制代码
else if (op == 4) {
    q.pop_back();
}

删除容器尾部元素,时间复杂度 O ( 1 ) O(1) O(1)。

✅ 操作 5:整体翻转容器

cpp 复制代码
else if (op == 5) {
    reverse(q.begin(), q.end());
}

使用 reverse() 函数直接反转整个 deque

时间复杂度 O(n),但题目说明操作次数较少(最多 10 10 10 次),完全可以接受。

✅ 操作 6:输出容器内容

cpp 复制代码
else if (op == 6) {
    cout << q.size() << endl;
    for (int x : q)
        cout << x << " ";
    cout << endl;
}

输出容器当前大小及所有元素。

完整代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, m;
    cin >> n >> m;
    deque<int> q;

    while (m--) // m次操作
    {
        int op, a;
        cin >> op; // 操作几 1~7
        if (op == 1)
        {
            cin >> a;
            q.push_front(a);
        }
        else if (op == 2)
        {
            q.pop_front();
        }
        else if (op == 3)
        {
            cin >> a;
            q.push_back(a);
        }
        else if (op == 4)
        {
            q.pop_back();
        }
        else if (op == 5)
        {
            reverse(q.begin(), q.end());
        }
        else if (op == 6)
        {
            cout << q.size() << endl;
            for (int x : q)
                cout << x << " ";
            cout << endl;
        }
        else
        {
            sort(q.begin(), q.end());
        }
    }
    return 0;
}
相关推荐
计算机安禾32 分钟前
【数据结构与算法】第35篇:归并排序与基数排序
c语言·数据结构·vscode·算法·排序算法·哈希算法·visual studio
专注API从业者36 分钟前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫
汀、人工智能1 小时前
[特殊字符] 第66课:跳跃游戏
数据结构·算法·数据库架构·图论·bfs·跳跃游戏
汀、人工智能1 小时前
[特殊字符] 第70课:加油站
数据结构·算法·数据库架构·图论·bfs·加油站
favour_you___1 小时前
2026_4_8算法练习题
数据结构·c++·算法
汀、人工智能2 小时前
[特殊字符] 第57课:搜索旋转排序数组
数据结构·算法·数据库架构·图论·bfs·搜索旋转排序数组
夏乌_Wx2 小时前
剑指offer | 2.4数据结构相关题目
数据结构·c++·算法·剑指offer·c/c++
minji...3 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
游乐码4 小时前
C#Queue
数据结构·游戏·c#
汀、人工智能5 小时前
[特殊字符] 第67课:跳跃游戏II
数据结构·算法·数据库架构·图论·bfs·跳跃游戏ii