#4993. 双端队列deque练习卷
双端队列deque练习卷
当前没有测试数据。
编程练习题点此跳转:
https://cpp.zhimabc.top/p/4992
https://cpp.zhimabc.top/p/4991
一、deque 重点知识提炼
本周主题:deque(双端队列)——一头一尾都能进出,比队列更灵活。
知识 1:deque 是什么
- deque 是双端队列(double-ended queue)的简称,队头和队尾两端都能插入和删除元素。
- 头文件:
#include <deque>。 - 与普通队列
queue的区别:queue只能队尾进、队头出(先进先出),而 deque 两端都可以。
知识 2:常用操作速记
push_back(x):在队尾加入 x。push_front(x):在队头加入 x。pop_back():删除队尾元素。pop_front():删除队头元素。front():读取队头元素(不删除)。back():读取队尾元素(不删除)。empty():判断队列是否为空,空返回 true,非空返回 false。size():返回队列中元素个数。clear():清空队列。
口诀:push 进,pop 出,front 头,back 尾,empty 判空。
知识 3:空队列要小心
- 在空队列上调用
front()、back()、pop_front()、pop_back()是未定义行为(可能出错),所以 pop / 读取前必须先empty()判断。
知识 4:deque 的额外能力
- deque 支持随机访问:可以用
q[i]按下标直接读取第 i 个元素(从 0 开始)。 - deque 头尾插入/删除的时间复杂度都是 O(1)(常数时间),非常快。
二、选择题(每题 4 分,共 20 分)
第 1 题
- 下列关于 deque 的说法,正确的是( )。
A. deque 只能从队尾插入、队头删除 B. deque 只能从队头插入、队尾删除 C. deque 在队头和队尾都可以插入和删除 D. deque 和数组一样,只能在固定位置插入删除
第 2 题
- 若要在 deque 的队头插入一个整数 x,应使用的操作是( )。
A. q.push_back(x)
B. q.push_front(x)
C. q.pop_front()
D. q.front()
第 3 题
- 若要在 deque 的队尾读取一个元素,应使用的操作是( )。
A. q.front()
B. q.pop_back()
C. q.back()
D. q.push_back()
第 4 题
- 在 deque 上删除队头元素前,需要先判断队列是否为空,用到的函数是( )。
A. q.clear()
B. q.size()
C. q.front()
D. q.empty()
第 5 题
- 下列说法正确的是( )。
A. deque 的头尾插入和删除的时间复杂度都是 O(1)
B. deque 只能通过下标访问元素,不能头尾操作
C. deque 是先进先出的结构,队尾插入后只能队尾删除
D. deque 空队列上调用 pop_front() 一定是安全的
三、判断题(每题 4 分,共 20 分)
第 6 题
- deque 只允许从队尾一端插入和删除元素。( )
A. 正确 B. 错误
第 7 题
- 在空 deque 上调用
pop_front()是安全的,不会有任何问题。( )
A. 正确 B. 错误
第 8 题
- deque 支持用下标随机访问元素,例如
q[0]可以读取队头元素。( )
A. 正确 B. 错误
第 9 题
- 普通队列
queue也可以在队头用push_front插入元素。( )
A. 正确 B. 错误
第 10 题
- 判断 deque 是否为空可以用
q.empty(),空时返回 true。( )
A. 正确 B. 错误
四、代码填空题(每题 5 分,共 20 分,从选项中选出正确的一行填入 ____)
第 11 题
- 下面的程序先向队尾依次加入 1、2、3,再从队头依次取出并输出,请补全代码。
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> q;
for (int i = 1; i <= 3; i++) {
q.____(i); // 第 1 空:队尾加入 i
}
while (!q.empty()) {
cout << q.____() << " "; // 第 2 空:读取队头元素
q.____(); // 第 3 空:删除队头元素
}
return 0;
}
可供选择的选项(每空选一项):
A. front B. back C. push_back D. pop_front
请在对应位置写出三处的选择(如:第1空 C,第2空 A,第3空 D)。
第 12 题
- 下面的程序在队头插入元素后,输出队头元素,请补全代码。
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> q;
q.____(9); // 第 1 空:队头插入 9
q.push_back(7);
cout << q.____() << endl; // 第 2 空:输出队头元素
return 0;
}
可供选择的选项(每空选一项):
A. front B. push_front C. push_back D. back
第 13 题
- 下面的程序先判断队列是否为空,再输出队尾元素,请补全代码。
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> q;
q.push_back(5);
if (!q.____()) { // 第 1 空:判断队列是否为空
cout << q.____() << endl; // 第 2 空:输出队尾元素
}
return 0;
}
可供选择的选项(每空选一项):
A. back B. empty C. front D. size
第 14 题
- 下面的程序模拟"把队头的一张牌放到队尾",请补全代码。
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> q;
q.push_back(1);
q.push_back(2);
int x = q.____(); // 第 1 空:读取队头牌
q.____(); // 第 2 空:删除队头牌
q.____(x); // 第 3 空:把牌放回队尾
return 0;
}
可供选择的选项(每空选一项):
A. front B. push_back C. pop_front D. back
五、代码意思分析题(每题 8 分,共 24 分)
第 15 题
- 阅读下面的程序,写出它的输出结果。
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> q;
for (int i = 1; i <= 3; i++) {
q.push_back(i);
}
q.push_front(0);
while (!q.empty()) {
cout << q.front() << " ";
q.pop_front();
}
return 0;
}
请写出程序输出。
第 16 题
- 阅读下面的程序,写出它的输出结果。
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> q;
q.push_back(1);
q.push_back(2);
q.push_back(3);
q.pop_back();
cout << q.back() << endl;
q.pop_front();
cout << q.front() << endl;
return 0;
}
请写出程序输出(两行分别是什么)。
第 17 题
- 阅读下面的函数,说明它的作用并写出返回值。
#include <deque>
using namespace std;
int f() {
deque<int> q;
q.push_back(1);
q.push_back(2);
q.push_back(3);
q.pop_front();
return q.front();
}
请说明函数 f 的作用,并写出它的返回值。