林老师 · 客观题题库 · 第 8 章 栈与队列 · 知识细节练习

第 8 章 栈与队列 · 知识细节练习

100 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-第8章栈与队列-知识细节练习
题目总数100 题 · 100 分
试卷类型客观题
考生须知:
① 本卷共 16 大部分,合计 100 题 · 100 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 100 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

栈的基本概念

6 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

判断题:栈的特点是后进先出(LIFO)。

(1 分)
第 2 题 A2 未作答

判断题:栈的插入和删除都发生在栈顶这一端,栈底固定不动。

(1 分)
第 3 题 A3 未作答

判断题:入栈(push)把元素放到栈顶,出栈(pop)取出栈顶元素。

(1 分)
第 4 题 A4 未作答

判断题:top 操作只查看栈顶元素的值,不删除它。

(1 分)
第 5 题 A5 未作答

判断题:判断栈是否为空,只需看栈顶指针(或元素个数)是否为初始值。

(1 分)
第 6 题 A6 未作答

判断题:用定长数组实现栈时,push 前需要判断栈是否已满,否则会越界。

(1 分)

栈的应用

7 QUESTIONS · 2 POINTS EACH
第 7 题 B1 未作答

判断题:检查括号是否匹配,可以用栈:遇到左括号入栈,遇到右括号与栈顶配对。

(1 分)
第 8 题 B2 未作答

判断题:表达式求值(如 1 + 2 * 3)需要按运算符优先级处理,可以用栈保存操作数和运算符。

(1 分)
第 9 题 B3 未作答

判断题:函数递归调用时,每层调用的局部变量和返回地址保存在系统栈中。

(1 分)
第 10 题 B4 未作答

判断题:浏览器的后退、编辑器的撤销(Undo)功能,本质是栈的应用。

(1 分)
第 11 题 B5 未作答

判断题:十进制转二进制"除 2 取余"得到的余数序列需要逆序输出,适合用栈保存。

(1 分)
第 12 题 B6 未作答

判断题:深度优先搜索(DFS)可以用栈实现(显式或递归)。

(1 分)
第 13 题 B7 未作答

判断题:扫描括号串时,若遇到右括号而栈为空,说明该右括号没有匹配的左括号。

(1 分)

队列的基本概念

7 QUESTIONS · 2 POINTS EACH
第 14 题 C1 未作答

判断题:队列的特点是先进先出(FIFO)。

(1 分)
第 15 题 C2 未作答

判断题:队列的入队发生在队尾,出队发生在队头。

(1 分)
第 16 题 C3 未作答

判断题:入队(push/enqueue)把元素加到队尾,出队(pop/dequeue)取出队头元素。

(1 分)
第 17 题 C4 未作答

判断题:判断队列是否为空,可看队头与队尾指针是否相同(或元素个数是否为 0)。

(1 分)
第 18 题 C5 未作答

判断题:用定长数组实现队列时,push 前需要判断队列是否已满,否则会越界。

(1 分)
第 19 题 C6 未作答

判断题:打印任务排队、银行叫号等"先到先服务"场景适合用队列。

(1 分)
第 20 题 C7 未作答

判断题:广度优先搜索(BFS)用队列保存待访问节点。

(1 分)

循环队列

7 QUESTIONS · 2 POINTS EACH
第 21 题 D1 未作答

判断题:循环队列把数组首尾相接:队尾指针越界时回到数组开头(取模)。

(1 分)
第 22 题 D2 未作答

判断题:循环队列中 front == rear 表示队空;为了区分队满,通常浪费一个存储单元。

(1 分)
第 23 题 D3 未作答

判断题:循环队列入队:rear = (rear + 1) % capacity; q[rear] = x;

(1 分)
第 24 题 D4 未作答

判断题:循环队列出队:front = (front + 1) % capacity;

(1 分)
第 25 题 D5 未作答

循环队列容量为 88front = 2rear = 5,队列中有( )个元素。

(1 分)
第 26 题 D6 未作答

判断题:循环队列避免了顺序队列的"假溢出"——队头出队后空出的空间可以继续使用。

(1 分)
第 27 题 D7 未作答

判断题:顺序队列出队后 front 后移,数组前面的空间被浪费;循环队列让这些空间复用。

(1 分)

栈与队列的应用场景

6 QUESTIONS · 2 POINTS EACH
第 28 题 E1 未作答

判断题:函数调用时,参数、局部变量、返回地址依次压入系统调用栈;函数返回时按相反顺序弹出——递归的执行过程就是栈的典型应用。

(1 分)
第 29 题 E2 未作答

判断题:编辑器的撤销(undo)功能可以用栈实现:每步操作压栈,撤销时弹栈回退到上一步。

(1 分)
第 30 题 E3 未作答

判断题:银行叫号、打印任务排队等场景用队列模拟:先到达的先服务(FIFO),新任务排在队尾。

(1 分)
第 31 题 E4 未作答

判断题:BFS 用队列保存待访问节点——先进先出保证按层扩展,这是队列在算法中的典型应用。

(1 分)
第 32 题 E5 未作答

判断题:可以用两个栈实现队列,也可以用两个队列实现栈。

(1 分)
第 33 题 E6 未作答

判断题:栈适合"后进先出"的匹配与回溯场景(括号匹配、DFS),队列适合"先进先出"的排队与扩展场景(BFS)——按场景选结构。

(1 分)

复杂度与选择

6 QUESTIONS · 2 POINTS EACH
第 34 题 F1 未作答

判断题:栈和队列的插入、删除、取顶/取头操作都是 O(1)O(1)

(1 分)
第 35 题 F2 未作答

判断题:数组实现栈需预分配大小(可能栈满),链表实现栈不设上限(只受内存限制)。

(1 分)
第 36 题 F3 未作答

判断题:链表实现队列需维护队头队尾两个指针,入队出队才能都做到 O(1)O(1)

(1 分)
第 37 题 F4 未作答

判断题:顺序队列中,出队后 front 后移,即使数组前面有空位,rear 到末尾时也"看似满"——这叫假溢出。

(1 分)
第 38 题 F5 未作答

下列场景更适合用的是( )。

(1 分)
第 39 题 F6 未作答

判断题:C++ STL 的 stackqueue 是容器适配器,push/pop/topfront)等操作都是 O(1)O(1),是 CSP-J 最常用的两个容器。

(1 分)

综合应用

6 QUESTIONS · 2 POINTS EACH
第 40 题 G1 未作答

判断题:括号串 (()()) 是匹配的,()) 是不匹配的。

(1 分)
第 41 题 G2 未作答

后缀表达式 3 4 + 5 * 的值是( )。

(1 分)
第 42 题 G3 未作答

中缀表达式 a + b * c 转后缀为( )。

(1 分)
第 43 题 G4 未作答

判断题:逆波兰表达式就是后缀表达式(运算符写在操作数后面)。

(1 分)
第 44 题 G5 未作答

判断题:nn 个元素按顺序入栈,出栈序列的种数是卡特兰数。

(1 分)
第 45 题 G6 未作答

判断题:配对 ()[]{} 多种括号时,右括号必须与最近未配对的左括号同类型。

(1 分)

易错综合

5 QUESTIONS · 2 POINTS EACH
第 46 题 H1 未作答

判断题:数组实现栈时,栈顶指针常初始化为 1-1(空栈),push 时先 top++

(1 分)
第 47 题 H2 未作答

判断题:pop 前必须判断栈是否为空,空栈 pop 是错误操作(下溢)。

(1 分)
第 48 题 H3 未作答

判断题:数组实现队列时,常用约定:rear 指向队尾元素的下一个空位,front 指向队头元素。

(1 分)
第 49 题 H4 未作答

判断题:循环队列的指针移动都要对容量取模(%),否则会越界。

(1 分)
第 50 题 H5 未作答

下列说法错误的是( )。

(1 分)

数组模拟栈

6 QUESTIONS · 2 POINTS EACH
第 51 题 I1 未作答

01const int MAXN = 100;
02int stk[MAXN];    // 用数组模拟栈
03int top = -1;     // 栈顶下标:-1 表示空栈

判断题:push 前先 top++ 再存值,poptop--

(1 分)
第 52 题 I2 未作答

01const int MAXN = 100;
02int stk[MAXN];
03int top = -1;   // 栈顶下标,-1 表示空栈
04
05// 入栈:把 x 压入栈顶
06void push(int x) {
07    stk[++top] = x;
08}

判断题:stk[++top] = x; 是先移动栈顶指针,再存入元素。

(1 分)
第 53 题 I3 未作答

01const int MAXN = 100;
02int stk[MAXN];
03int top = -1;   // 栈顶下标,-1 表示空栈
04
05// 出栈:弹出栈顶元素
06int pop() {
07    return stk[top--];
08}

判断题:return stk[top--]; 是先取栈顶元素,再下移栈顶指针。

(1 分)
第 54 题 I4 未作答

01// 判断括号串是否匹配(只有小括号)
02bool check(const string &s) {
03    int top = 0;
04    char stk[100];
05    for (char c : s) {
06        if (c == '(') stk[top++] = c;        // 左括号入栈
07        else {                                // 右括号
08            if (top == 0) return false;       // 栈空:没有左括号可配
09            top--;                            // 弹出配对的左括号
10        }
11    }
12    return top == 0;                          // 栈空 = 全部配对
13}

判断题:check("(()())") 返回 truecheck("())") 返回 false

(1 分)
第 55 题 I5 未作答

// 依次执行:push(1) push(2) push(3) pop() pop() push(4) pop()
// 每次 pop 输出弹出的值,输出为( )。

(1 分)
第 56 题 I6 未作答

// 十进制 13 转二进制:不断除以 2 取余,余数依次为 1, 0, 1, 1
// 把余数依次入栈后,依次出栈输出为( )。

(1 分)

栈应用代码阅读

7 QUESTIONS · 2 POINTS EACH
第 57 题 J1 未作答

01// 判断括号串是否匹配(含 () [] {} 三种括号)
02bool check(const string &s) {
03    stack<char> st;
04    for (char c : s) {
05        if (c == '(' || c == '[' || c == '{') st.push(c);
06        else {
07            if (st.empty()) return false;
08            char t = st.top(); st.pop();
09            if (c == ')' && t != '(') return false;
10            if (c == ']' && t != '[') return false;
11            if (c == '}' && t != '{') return false;
12        }
13    }
14    return st.empty();
15}

判断题:check("([)]") 返回 false

(1 分)
第 58 题 J2 未作答

// 后缀表达式求值:遇数字入栈,遇运算符弹出两个数计算后压回
// 对后缀表达式 "5 3 + 2 *" 求值,结果是( )。

(1 分)
第 59 题 J3 未作答

中缀转后缀的规则:数字直接输出;运算符与栈顶比较,优先级不低于栈顶才入栈

中缀 a + b * c - d 转后缀,结果是( )。

(1 分)
第 60 题 J4 未作答

依次执行:push(1) push(2) pop() push(3) push(4) pop() pop() pop()

每次 pop 输出弹出的值,输出为( )。

(1 分)
第 61 题 J5 未作答

判断题:递归程序可以用"显式栈"模拟(把每层的状态压栈),避免递归深度过大导致的栈溢出。

(1 分)
第 62 题 J6 未作答

判断题:表达式 1 + 2 * 3 求值时,先算 2 * 3 再算加法——运算符栈按优先级决定何时弹出运算。

(1 分)
第 63 题 J7 未作答

1、2、3 依次入栈(可在任意时刻出栈),下列哪个是【不合法】的出栈序列?( )。

(1 分)
拾壹

数组模拟队列

7 QUESTIONS · 2 POINTS EACH
第 64 题 K1 未作答

01const int MAXN = 100;
02int q[MAXN];       // 用数组模拟队列
03int front = 0;     // 队头下标:指向队头元素
04int rear = 0;      // 队尾下标:指向队尾元素的下一个空位

判断题:该约定下,front == rear 表示队列为空。

(1 分)
第 65 题 K2 未作答

01const int MAXN = 100;
02int q[MAXN];
03int front = 0, rear = 0;   // front 队头、rear 队尾下一个空位
04
05// 入队:把 x 加到队尾
06void push(int x) {
07    q[rear++] = x;
08}

判断题:q[rear++] = x; 是把元素存入队尾空位,然后队尾指针后移。

(1 分)
第 66 题 K3 未作答

01const int MAXN = 100;
02int q[MAXN];
03int front = 0, rear = 0;   // front 队头、rear 队尾下一个空位
04
05// 出队:取出队头元素
06int pop() {
07    return q[front++];
08}

判断题:return q[front++]; 是先取队头元素,再后移队头指针。

(1 分)
第 67 题 K4 未作答

01const int MAXN = 4;
02int q[MAXN];
03int front = 0, rear = 0;
04
05// 依次执行:push(1) push(2) push(3) pop() push(4)
06// 此时 front = 1, rear = 4

判断题:rear 已到数组末尾,但前面 q[0] 空着——这就是顺序队列的"假溢出"。

(1 分)
第 68 题 K5 未作答

依次执行:push(1) push(2) push(3) pop() push(4) pop() pop() pop()

每次 pop 输出弹出的值,输出为( )。

(1 分)
第 69 题 K6 未作答

约瑟夫问题用队列模拟:队头出队、报数不为 k 的重新入队(到队尾),报数为 k 的出列

n = 5, k = 2(报到 2 出列),出列顺序是( )。

(1 分)
第 70 题 K7 未作答

01// BFS 模板:起点入队,不断出队访问并把未访问的邻居入队
02queue<int> q;
03q.push(start);
04vis[start] = true;
05while (!q.empty()) {
06    int u = q.front(); q.pop();
07    for (int v : 邻接表[u])
08        if (!vis[v]) { vis[v] = true; q.push(v); }
09}

判断题:BFS 按"离起点由近到远"的顺序访问节点。

(1 分)
拾贰

循环队列代码

7 QUESTIONS · 2 POINTS EACH
第 71 题 L1 未作答

01const int MAXN = 8;
02int q[MAXN];
03int front = 0, rear = 0;   // 循环队列:指针移动都 % MAXN
04int cnt = 0;               // 当前元素个数

判断题:用 cnt 计数时,队空为 cnt == 0,队满为 cnt == MAXN,不需要浪费空间。

(1 分)
第 72 题 L2 未作答

01const int MAXN = 8;
02int q[MAXN];
03int front = 0, rear = 0;
04
05// 循环队列入队(用 cnt 计数判满)
06void push(int x) {
07    q[rear] = x;
08    rear = (rear + 1) % MAXN;   // 队尾指针后移并取模
09    cnt++;
10}

判断题:rear = (rear + 1) % MAXN 让 rear 越界时回到数组开头。

(1 分)
第 73 题 L3 未作答

01const int MAXN = 8;
02int q[MAXN];
03int front = 0, rear = 0;
04
05// 循环队列出队
06int pop() {
07    int x = q[front];
08    front = (front + 1) % MAXN;   // 队头指针后移并取模
09    cnt--;
10    return x;
11}

判断题:front = (front + 1) % MAXN 出队后队头指针绕回。

(1 分)
第 74 题 L4 未作答

01const int MAXN = 8;
02int q[MAXN];
03int front = 0, rear = 0;   // 浪费一个空位的循环队列
04
05// 队空:front == rear;队满:(rear + 1) % MAXN == front

判断题:容量为 88 的循环队列(浪费一格),最多能存 77 个元素。

(1 分)
第 75 题 L5 未作答

01const int MAXN = 8;
02// 循环队列:front = 6, rear = 2,元素个数 = (rear - front + MAXN) % MAXN

队列中有( )个元素。

(1 分)
第 76 题 L6 未作答

01const int MAXN = 4;   // 循环队列,浪费一格,最多存 3 个
02int q[MAXN];
03int front = 0, rear = 0;
04
05// 依次执行:push(1) push(2) push(3) pop() pop() push(4)
06// 执行完后,队列中从队头到队尾的元素是( )。

(1 分)
第 77 题 L7 未作答

判断题:循环队列数组大小 NN,浪费一格判满时,队列实际最多容纳 N1N-1 个元素。

(1 分)
拾叁

栈队列应用代码

6 QUESTIONS · 2 POINTS EACH
第 78 题 M1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    string s = "abcba";
05    stack<char> st;
06    for (char c : s) st.push(c);       // 全部压栈
07    bool ok = true;
08    for (char c : s) {                 // 弹栈顺序 = 逆序,与正序逐个比较
09        if (st.top() != c) ok = false;
10        st.pop();
11    }
12    cout << (ok ? "YES" : "NO");
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 79 题 M2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    queue<int> q;
05    for (int i = 1; i <= 5; i++) q.push(i);   // 5 个人排队
06    while (!q.empty()) {
07        cout << q.front() << " ";             // 叫号
08        q.pop();
09    }
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 80 题 M3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {1, 2, 3, 4, 5};
05    stack<int> st;
06    for (int i = 0; i < 5; i++) st.push(a[i]);
07    while (!st.empty()) { cout << st.top() << " "; st.pop(); }
08    return 0;
09}

单选题:程序输出是?

(1 分)
第 81 题 M4 未作答

单选题:用两个队列模拟栈时,出栈操作的正确做法是?

(1 分)
第 82 题 M5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6];                        // 循环队列,容量 6,下标 0~5
05    int front = 0, rear = 0;
06    for (int i = 1; i <= 8; i++) {   // 依次入队 8 个元素(每 4 次出队 1 次腾位置)
07        a[rear] = i;
08        rear = (rear + 1) % 6;
09        if (i % 4 == 0) front = (front + 1) % 6;
10    }
11    cout << front << " " << rear;
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 83 题 M6 未作答

用两个栈实现队列:入队压入栈 A;出队时若栈 B 空,把 A 全部倒入 B,再从 B 弹出

判断题:每个元素最多被"倒"一次,均摊复杂度 O(1)O(1)

(1 分)
拾肆

完善程序

7 QUESTIONS · 2 POINTS EACH
第 84 题 N1 未作答

01const int MAXN = 100;
02int stk[MAXN];
03int top = -1;   // 栈顶下标,-1 表示空栈
04
05// 入栈:把 x 压入栈顶
06void push(int x) {
07    stk[______] = x;
08}

横线处应填( )。

(1 分)
第 85 题 N2 未作答

01const int MAXN = 100;
02int stk[MAXN];
03int top = -1;   // 栈顶下标,-1 表示空栈
04
05// 出栈:弹出并返回栈顶元素
06int pop() {
07    return stk[______];
08}

横线处应填( )。

(1 分)
第 86 题 N3 未作答

01const int MAXN = 100;
02int q[MAXN];
03int front = 0, rear = 0;   // front 队头、rear 队尾下一个空位
04
05// 入队:把 x 加到队尾
06void push(int x) {
07    q[rear] = x;
08    ______;
09}

横线处应填( )。

(1 分)
第 87 题 N4 未作答

01const int MAXN = 100;
02int q[MAXN];
03int front = 0, rear = 0;   // front 队头、rear 队尾下一个空位
04
05// 出队:取出并返回队头元素
06int pop() {
07    return q[______];
08}

横线处应填( )。

(1 分)
第 88 题 N5 未作答

01const int MAXN = 8;
02int q[MAXN];
03int front = 0, rear = 0;   // 循环队列:指针移动 % MAXN
04
05// 循环队列入队
06void push(int x) {
07    q[rear] = x;
08    rear = ______;
09}

横线处应填( )。

(1 分)
第 89 题 N6 未作答

01// 判断括号串是否匹配:左括号入栈,右括号与栈顶配对
02bool check(const string &s) {
03    stack<char> st;
04    for (char c : s) {
05        if (c == '(') st.push(c);
06        else {
07            if (______) return false;   // 右括号但栈空
08            st.pop();
09        }
10    }
11    return st.empty();
12}

横线处应填( )。

(1 分)
第 90 题 N7 未作答

01// 后缀表达式求值:遇数字入栈,遇运算符弹出两个数计算
02// 弹出时:b = 栈顶(右操作数),a = 次栈顶(左操作数)
03string expr = "53+2*";        // 后缀表达式:5 3 + 2 *
04stack<int> stk;               // 数字栈
05int val = 0;
06for (char c : expr) {
07    if (isdigit(c)) stk.push(c - '0');
08    else {
09        int b = stk.top(); stk.pop();
10        int a = stk.top(); stk.pop();
11        if (c == '+') stk.push(______);
12    }
13}

横线处应填( )。

(1 分)
拾伍

代码综合应用

5 QUESTIONS · 2 POINTS EACH
第 91 题 O1 未作答

依次执行:push(1) push(2) push(3) pop() push(4) pop()

两次 pop 输出的值是( )。

(1 分)
第 92 题 O2 未作答

依次执行:push(1) push(2) pop() push(3) pop() pop()

三次 pop 输出的值是( )。

(1 分)
第 93 题 O3 未作答

01const int MAXN = 4;   // 循环队列(浪费一格),front = 0, rear = 0
02// 依次执行:push(1) push(2) push(3) pop() push(4) pop() pop() pop()
03// 依次出队输出的值是( )。

(1 分)
第 94 题 O4 未作答

统计括号串中最深的嵌套层数:"(()(()))" 的嵌套深度是( )。

(1 分)
第 95 题 O5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int n = 13;
05    stack<int> st;
06    while (n > 0) {
07        st.push(n % 2);                // 余数入栈
08        n /= 2;
09    }
10    while (!st.empty()) { cout << st.top(); st.pop(); }   // 逆序弹出
11    return 0;
12}

单选题:程序输出是?

(1 分)
拾陆

代码易错

5 QUESTIONS · 2 POINTS EACH
第 96 题 P1 未作答

01// 入栈:
02void push(int x) {
03    stk[top + 1] = x;   // 忘记 top++
04}

判断题:这样写多次 push 会反复覆盖同一个位置,栈数据丢失。

(1 分)
第 97 题 P2 未作答

01// 出队:
02int pop() {
03    return q[front++];   // 未判断队列是否为空
04}

判断题:对空队列执行该 pop 会取出无意义数据(下溢),应先判空。

(1 分)
第 98 题 P3 未作答

01// 循环队列出队:
02int pop() {
03    int x = q[front];
04    front++;            // 忘记 % MAXN
05    return x;
06}

判断题:front 会不断增大最终越界,必须写 front = (front + 1) % MAXN

(1 分)
第 99 题 P4 未作答

队列操作中写反:

入队时误写 q[front] = x; front++;

出队时误写 return q[rear--];

判断题:这样写会破坏队列结构,队头队尾含义完全颠倒。

(1 分)
第 100 题 P5 未作答

下列说法错误的是( )。

(1 分)