牛客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;
}
相关推荐
闲人不梦卿20 分钟前
数组和矩阵以及广义表
数据结构
苦藤新鸡1 小时前
41.有序数组(二叉搜索树)转平衡二叉树
数据结构·力扣
毅炼3 小时前
hot100打卡——day14
java·数据结构·算法·leetcode·ai·深度优先·哈希算法
DLGXY3 小时前
数据结构——双向循环链表的建立、添加、遍历(十三)
数据结构·链表
C雨后彩虹3 小时前
优雅子数组
java·数据结构·算法·华为·面试
漫随流水3 小时前
leetcode回溯算法(46.全排列)
数据结构·算法·leetcode·回溯算法
睡一觉就好了。4 小时前
直接选择排序
数据结构·算法·排序算法
芬加达4 小时前
leetcode221 最大正方形
java·数据结构·算法
知无不研4 小时前
实现一个整形栈
c语言·数据结构·c++·算法
红豆诗人6 小时前
数据结构--顺序表
数据结构·顺序表