#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 题

  1. 下列关于 deque 的说法,正确的是( )。

A. deque 只能从队尾插入、队头删除 B. deque 只能从队头插入、队尾删除 C. deque 在队头和队尾都可以插入和删除 D. deque 和数组一样,只能在固定位置插入删除

第 2 题

  1. 若要在 deque 的队头插入一个整数 x,应使用的操作是( )。

A. q.push_back(x) B. q.push_front(x) C. q.pop_front() D. q.front()

第 3 题

  1. 若要在 deque 的队尾读取一个元素,应使用的操作是( )。

A. q.front() B. q.pop_back() C. q.back() D. q.push_back()

第 4 题

  1. 在 deque 上删除队头元素前,需要先判断队列是否为空,用到的函数是( )。

A. q.clear() B. q.size() C. q.front() D. q.empty()

第 5 题

  1. 下列说法正确的是( )。

A. deque 的头尾插入和删除的时间复杂度都是 O(1) B. deque 只能通过下标访问元素,不能头尾操作 C. deque 是先进先出的结构,队尾插入后只能队尾删除 D. deque 空队列上调用 pop_front() 一定是安全的


三、判断题(每题 4 分,共 20 分)

第 6 题

  1. deque 只允许从队尾一端插入和删除元素。( )

A. 正确 B. 错误

第 7 题

  1. 在空 deque 上调用 pop_front() 是安全的,不会有任何问题。( )

A. 正确 B. 错误

第 8 题

  1. deque 支持用下标随机访问元素,例如 q[0] 可以读取队头元素。( )

A. 正确 B. 错误

第 9 题

  1. 普通队列 queue 也可以在队头用 push_front 插入元素。( )

A. 正确 B. 错误

第 10 题

  1. 判断 deque 是否为空可以用 q.empty(),空时返回 true。( )

A. 正确 B. 错误


四、代码填空题(每题 5 分,共 20 分,从选项中选出正确的一行填入 ____)

第 11 题

  1. 下面的程序先向队尾依次加入 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 题

  1. 下面的程序在队头插入元素后,输出队头元素,请补全代码。
#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 题

  1. 下面的程序先判断队列是否为空,再输出队尾元素,请补全代码。
#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 题

  1. 下面的程序模拟"把队头的一张牌放到队尾",请补全代码。
#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 题

  1. 阅读下面的程序,写出它的输出结果。
#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 题

  1. 阅读下面的程序,写出它的输出结果。
#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 题

  1. 阅读下面的函数,说明它的作用并写出返回值。
#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 的作用,并写出它的返回值。