码蹄集 - MT2140 - 双端队列

@TOC


双端队列

时间限制:1秒
空间限制:128M


题目描述

小码哥想创建一个双端队列,即,两头都能进,两头都能访问,两头都能出。请你创建一个这样的双端队列并帮他实现以下三种操作:

  1. 1 x //将整数x增加到头部
  2. 2 x //将整数x增加到尾部
  3. 3 //访问头部的元素
  4. 4 //访问尾部的元素
  5. 5 //弹出(删除)头部的元素
  6. 6 //弹出(删除)尾部的元素

这个双端数列一开始是空的。


输入描述

第一行输入一个整数n,表示操作个数。
接下来n行,每行输入一个操作,格式如题目描述中所示。

数据范围

保证:对于100%的数据:1<=n<=1,000,000,x在int类型范围内,数列为空时只进行操作1和2。


输出描述

对于每个操作3和4,输出一行一个整数表示答案。


样例一

输入

1
2
3
4
5
6
7
8
9
10
11
12
11
1 3
1 6
2 9
3
4
5
2 7
2 8
6
3
4

输出

1
2
3
4
6
9
3
7

题目分析

本片题解提供一种使用C++ list 模拟双端队列的方法

list可以很方便地进行头部和尾部的插入删除取值操作,正好是题目要求进行的6种操作。

  • 插入头部:push_front
  • 插入尾部:push_back
  • 访问头部:*.first
  • 访问尾部:back
  • 删除头部:pop_front
  • 删除尾部:pop_back

因此直接进行模拟即可。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
* @Author: LetMeFly
* @Date: 2022-09-28 20:33:04
* @LastEditors: LetMeFly
* @LastEditTime: 2022-09-28 20:35:15
*/
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
int main() {
int N;
cin >> N;
list<int> li;
while (N--) {
int op;
cin >> op;
if (op == 1) {
int x;
cin >> x;
li.push_front(x);
}
else if (op == 2) {
int x;
cin >> x;
li.push_back(x);
}
else if (op == 3) {
cout << *li.begin() << endl;
}
else if (op == 4) {
cout << li.back() << endl;
}
else if (op == 5) {
li.pop_front();
}
else {
li.pop_back();
}
}
return 0;
}

虽然代码可以复制,但最好还是自己理解后再敲哦

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127097523


码蹄集 - MT2140 - 双端队列
https://blog.letmefly.xyz/2022/09/28/MaTiJi - MT2140 - 双端队列/
作者
Tisfy
发布于
2022年9月28日
许可协议