林老师 · 客观题题库 · 专题 05 栈与队列 · 复习强化

专题 05 栈与队列 · 复习强化

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

判 分 报 告

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

栈的概念与操作

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

栈这种数据结构的特点是( )。

(1 分)
第 2 题 A2 未作答

栈中允许插入和删除的一端称为( )。

(1 分)
第 3 题 A3 未作答

S 依次执行:push(1)push(2)push(3)pop()push(4)。此时栈中从栈底到栈顶的元素是( )。

(1 分)
第 4 题 A4 未作答

阅读下面的程序(top 指向栈顶元素):

01int st[100], top = -1;
02st[++top] = 1;
03st[++top] = 2;
04cout << st[top];
05cout << st[top];

程序的输出是( )。

(1 分)
第 5 题 A5 未作答

数组实现的栈用 top = -1 表示栈空。pop 操作前应检查的条件是( )。

(1 分)
第 6 题 A6 未作答

某数据结构依次执行「压入 A、压入 B、弹出 B、压入 C」后,容器内从底到顶为 A、C。该数据结构是( )。

(1 分)

出栈序列

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

入栈顺序为 a, b, c, d, e,下列可能的出栈序列是( )。

(1 分)
第 8 题 B2 未作答

入栈顺序为 1, 2, 3, 4,若 4 个元素全部入栈后再依次出栈,出栈序列是( )。

(1 分)
第 9 题 B3 未作答

入栈顺序为 1, 2, 3,若每个元素入栈后立即出栈(进一个出一个),出栈序列是( )。

(1 分)
第 10 题 B4 未作答

6 个元素按 6, 5, 4, 3, 2, 1 的顺序进栈,下列非法的出栈序列是( )。

(1 分)
第 11 题 B5 未作答

3 个不同元素依次进栈(可随时出栈),可能的出栈序列共有( )种。

(1 分)
第 12 题 B6 未作答

入栈顺序 1, 2, 3, 4(按此顺序依次到达)。关于出栈序列,下列说法正确的是( )。

(1 分)
第 13 题 B7 未作答

判断一个出栈序列是否合法的实用方法是( )。

(1 分)
第 14 题 B8 未作答

入栈顺序为 1, 2, 3, 4, 5,下列不可能的出栈序列是( )。

(1 分)
第 15 题 B9 未作答

入栈顺序为 a, b, c, d, e,栈的容量为 3(同时最多存 3 个元素)。下列出栈序列中,因容量不足而不可能实现的是( )。

(1 分)
第 16 题 B10 未作答

3 个元素 e1, e2, e3 依次到达,每个元素按「进栈 S、出栈 S、进队列 Q、出队列 Q」处理,元素之间的操作可以交错。最终不同的出队列序列共有( )种。

(1 分)
第 17 题 B11 未作答

关于合法出栈序列的性质,下列说法正确的是( )。

(1 分)
第 18 题 B12 未作答

入栈顺序为 1, 2, 3, 4, 5, 6,下列不可能的出栈序列是( )。

(1 分)
第 19 题 B13 未作答

4 个不同元素依次进栈(可随时出栈),可能的出栈序列共有( )种。

(1 分)
第 20 题 B14 未作答

入栈顺序为 a, b, c, d。若 a第一个出栈的元素,满足条件的出栈序列共有( )种。

(1 分)

表达式转换

15 QUESTIONS · 2 POINTS EACH
第 21 题 C1 未作答

表达式 a*(b+c)*d 的后缀表达式是( )。

(1 分)
第 22 题 C2 未作答

后缀表达式 6 2 3 + - 3 8 2 / + * 对应的中缀表达式是( )。

(1 分)
第 23 题 C3 未作答

表达式 a+(b-c)*d 的前缀表达式是( )。

(1 分)
第 24 题 C4 未作答

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

(1 分)
第 25 题 C5 未作答

前缀表达式 * + 3 4 2 的值是( )。

(1 分)
第 26 题 C6 未作答

后缀表达式(逆波兰式)的最大优点是( )。

(1 分)
第 27 题 C7 未作答

中缀表达式 (a+b)*c 转成后缀时,括号( )。

(1 分)
第 28 题 C8 未作答

后缀表达式 a b c + * 对应的前缀表达式是( )。

(1 分)
第 29 题 C9 未作答

用运算符栈把中缀 a + b * c 转后缀,读到 * 时(a+b 已处理),运算符栈从底到顶是( )。

(1 分)
第 30 题 C10 未作答

双栈法求中缀表达式的值时,读到新运算符,若其优先级高于栈顶运算符,正确的做法是( )。

(1 分)
第 31 题 C11 未作答

把中缀表达式 (a+b)*c 画成一棵表达式树(操作数在叶、运算符在内点),对该树做后序遍历得到的是( )。

(1 分)
第 32 题 C12 未作答

表达式 a+b*c-(d/e+f)*g 的后缀表达式是( )。

(1 分)
第 33 题 C13 未作答

前缀表达式 * + a b - c d 对应的中缀表达式是( )。

(1 分)
第 34 题 C14 未作答

后缀表达式 7 2 3 * - 的值是( )。

(1 分)
第 35 题 C15 未作答

前缀表达式又称( ),后缀表达式又称( )。

(1 分)

队列

13 QUESTIONS · 2 POINTS EACH
第 36 题 D1 未作答

队列的特点是( )。

(1 分)
第 37 题 D2 未作答

队列中允许删除的一端是( ),允许插入的一端是( )。

(1 分)
第 38 题 D3 未作答

空队列依次执行 push(1)push(2)push(3)pop()push(4) 后(push 表示入队),从队头到队尾的元素是( )。

(1 分)
第 39 题 D4 未作答

元素 1, 2, 3 依次入队(只入队出队,无其他操作),出队序列是( )。

(1 分)
第 40 题 D5 未作答

容量为 55 的循环队列(数组下标 040\sim4),rear = 4 时再入队一个元素,新的 rear 是( )。

(1 分)
第 41 题 D6 未作答

容量为 nn 的循环队列用 (rear + 1) % n == front 判满时,实际最多能存( )个元素。

(1 分)
第 42 题 D7 未作答

容量为 88 的循环队列(下标 070\sim7),当前 front = 2rear = 5。执行 2 次出队、3 次入队后,frontrear 分别是( )。

(1 分)
第 43 题 D8 未作答

循环队列判空可以用 front == rear,也可以用一个 size 计数器。前一种方案的特点是( )。

(1 分)
第 44 题 D9 未作答

55 个人编号 151\sim5 围成一圈,从 11 号开始报数,报到 33 的人出圈,用队列模拟。出圈的顺序是( )。

(1 分)
第 45 题 D10 未作答

广度优先搜索(BFS)逐层扩展节点时使用队列而不是栈,原因是( )。

(1 分)
第 46 题 D11 未作答

双端队列(deque)与普通队列的区别是( )。

(1 分)
第 47 题 D12 未作答

输入序列 1, 2, 3, 4, 5,全部进入容器后再全部取出:经过的输出是( ),经过队列的输出是( )。

(1 分)
第 48 题 D13 未作答

阅读下面的程序:

01int q[100], front = 0, rear = 0;
02while (front != rear) {
03    cout << q[front] << " ";
04    front = (front + 1) % 100;
05}

若循环队列当前为,该循环的执行情况是( )。

(1 分)

栈队列综合

12 QUESTIONS · 2 POINTS EACH
第 49 题 E1 未作答

栈和队列的共同点是( )。

(1 分)
第 50 题 E2 未作答

「编辑器的撤销操作」和「打印任务排队」分别适合用( )实现。

(1 分)
第 51 题 E3 未作答

用两个栈 S1(入)和 S2(出)模拟队列,元素 1, 2, 3 依次入 S1 后,要取出队头元素 1 的操作是( )。

(1 分)
第 52 题 E4 未作答

用队列模拟栈的 pop 操作(栈顶出),需要( )。

(1 分)
第 53 题 E5 未作答

S 和队列 Q 初始为空。元素 e1, e2, e3, e4 依次执行「进 S、出 S、进 Q、出 Q」且各元素操作不交错。最终出 Q 的序列是( )。

(1 分)
第 54 题 E6 未作答

初始空的整数栈 S 和队列 P,依次处理输入 7, 5, 8, 3:奇数压入 S、偶数入 P。处理完后先弹出 S 的全部(从栈顶往下)再输出 P 的全部(从队头往后),得到的序列是( )。

(1 分)
第 55 题 E7 未作答

下列关于数据结构的表述中,不恰当的是( )。

(1 分)
第 56 题 E8 未作答

用栈 S1(入队)和 S2(出队)模拟队列:1, 2, 3 已压入 S1,此时执行一次出队(把 S1 倒入 S2 后弹出 1)。新元素 4 此时应压入( )。

(1 分)
第 57 题 E9 未作答

用队列模拟栈的 pop 操作,需要把前 n1n-1 个元素转移,单次 pop 的时间代价是( )。

(1 分)
第 58 题 E10 未作答

输入序列 1, 2, 3, 4, 5 经过一个栈(可随时进出)后得到输出序列。下列输出序列中无法实现的是( )。

(1 分)
第 59 题 E11 未作答

输入序列 a, b, c 经过某个容器后输出 c, b, a;同样的输入经过另一个容器输出 a, b, c。这两个容器分别是( )。

(1 分)
第 60 题 E12 未作答

输入序列 1, 2, 3, 4,要得到输出 1 2 4 3。下列判断正确的是( )。

(1 分)

代码阅读

16 QUESTIONS · 2 POINTS EACH
第 61 题 F1 未作答

阅读下面的程序:

01int st[100], top = -1;
02void push(int x) {
03    st[++top] = x;
04}
05push(1); push(2); push(3);
06cout << top;

程序的输出是( )。

(1 分)
第 62 题 F2 未作答

阅读下面的程序:

01int st[100], top = 2;   // 栈中已有 3 个元素
02int x = st[top--];
03cout << x << " " << top;

程序的输出是( )。

(1 分)
第 63 题 F3 未作答

阅读下面的程序:

01int q[100], head = 0, tail = 0;   // tail 指向队尾下一个空位
02q[tail++] = 10;
03q[tail++] = 20;
04int x = q[head++];
05cout << x << " " << tail - head;

程序的输出是( )。

(1 分)
第 64 题 F4 未作答

容量为 1010 的循环队列,front = 3rear = 7(rear 指向队尾下一空位),当前队列中的元素个数是( )。

(1 分)
第 65 题 F5 未作答

阅读下面的程序(判断括号序列是否匹配):

01bool match(string s) {
02    stack<char> st;
03    for (char c : s) {
04        if (c == '(') st.push(c);
05        else if (c == ')' && !st.empty()) st.pop();
06        else if (c == ')') return false;
07    }
08    return st.empty();
09}

调用 match("(()") 的返回值是( )。

(1 分)
第 66 题 F6 未作答

阅读下面的程序(后缀表达式求值):

01stack<int> st;
02int a = 3, b = 4, c = 2;
03st.push(a); st.push(b); st.push(c);
04int x = st.top(); st.pop();
05int y = st.top(); st.pop();
06st.push(x * y);
07int z = st.top(); st.pop();
08int w = st.top(); st.pop();
09st.push(z + w);
10cout << st.top();

程序的输出是( )。

(1 分)
第 67 题 F7 未作答

C++ STL 中,栈和队列对应的容器适配器分别是( )。

(1 分)
第 68 题 F8 未作答

阅读下面的程序(中缀转后缀,操作数为小写字母):

01string toPost(string s) {
02    stack<char> op;  string out;
03    for (char c : s) {
04        if (isalpha(c)) out += c;
05        else if (c == '(') op.push(c);
06        else if (c == ')') {
07            while (op.top() != '(') { out += op.top(); op.pop(); }
08            op.pop();
09        } else {
10            while (!op.empty() && prio(op.top()) >= prio(c)) {
11                out += op.top(); op.pop();
12            }
13            op.push(c);
14        }
15    }
16    while (!op.empty()) { out += op.top(); op.pop(); }
17    return out;
18}

处理运算符 cwhile 弹栈(条件 prio(op.top()) >= prio(c))的作用是( )。

(1 分)
第 69 题 F9 未作答

阅读下面的完整程序(把后缀表达式转换成中缀表达式):

01#include <iostream>
02#include <stack>
03#include <string>
04using namespace std;
05
06int main() {
07    string post = "xy+z*";   // 后缀表达式,操作数为字母
08    stack<string> st;
09    for (char c : post) {
10        if (c == '+' || c == '*') {
11            string b = st.top(); st.pop();  // 先弹出
12            string a = st.top(); st.pop();  // 后弹出
13            st.push("(" + a + c + b + ")");
14        } else {
15            st.push(string(1, c));
16        }
17    }
18    cout << st.top();
19    return 0;
20}

程序运行到处理字符 * 的那一刻,变量 ba 的值分别是( )。

(1 分)
第 70 题 F10 未作答

阅读下面的程序(双栈求中缀值,个位数字,运算符 + - *prio('*') > prio('+') = prio('-')):

01int calc(string s) {
02    stack<int> num;  stack<char> op;
03    auto doOp = [&]() {
04        int b = num.top(); num.pop();
05        int a = num.top(); num.pop();
06        num.push(op.top() == '+' ? a + b :
07                 op.top() == '*' ? a * b : a - b);
08        op.pop();
09    };
10    for (char c : s) {
11        if (isdigit(c)) num.push(c - '0');
12        else {
13            while (!op.empty() && prio(op.top()) >= prio(c)) doOp();
14            op.push(c);
15        }
16    }
17    while (!op.empty()) doOp();
18    return num.top();
19}

calc("2+3*4") 的返回值是( )。

(1 分)
第 71 题 F11 未作答

阅读下面的程序:

01stack<int> s;
02s.push(1); s.push(2); s.pop();
03s.push(3); s.push(4);
04cout << s.top() << " " << s.size();

程序的输出是( )。

(1 分)
第 72 题 F12 未作答

阅读下面的程序:

01queue<int> q;
02q.push(1); q.push(2); q.pop();
03q.push(3);
04cout << q.front() << " " << q.back();

程序的输出是( )。

(1 分)
第 73 题 F13 未作答

链栈(用单链表头做栈顶)的 push 操作,正确的步骤是( )。

(1 分)
第 74 题 F14 未作答

补全下面的循环队列入队代码(容量 m):

01void enqueue(int x) {
02    q[rear] = x;
03    ____;
04}

横线处应填( )。

(1 分)
第 75 题 F15 未作答

补全括号匹配代码(检测小括号):

01bool match(string s) {
02    stack<char> st;
03    for (char c : s) {
04        if (c == '(') st.push(c);
05        else if (c == ')') {
06            if (____) return false;
07            st.pop();
08        }
09    }
10    return st.empty();
11}

横线处应填( )。

(1 分)
第 76 题 F16 未作答

阅读下面的程序(用栈输出 x 的二进制):

01int x = 6;
02stack<int> st;
03while (x > 0) { st.push(x % 2); x /= 2; }
04while (!st.empty()) { cout << st.top(); st.pop(); }

程序的输出是( )。

(1 分)

易错

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

数组栈有两种常见实现约定:

  • 约定一:top 指向栈顶元素,空栈时 top = -1
  • 约定二:top 指向栈顶的下一个空位,空栈时 top = 0

两种约定各自合法。下列 push / pop 的配对全部正确的是( )。

(1 分)
第 78 题 G2 未作答

对空栈执行 pop() 且代码没有判空保护,结果是( )。

(1 分)
第 79 题 G3 未作答

循环队列判满 (rear + 1) % n == front 与判空 front == rear 会冲突吗?最常用的解决方案是( )。

(1 分)
第 80 题 G4 未作答

顺序队列 head(front)和 tail(rear)的移动规则是( )。

(1 分)
第 81 题 G5 未作答

容量 100 的顺序队列,经历多次入队出队后 front = tail = 100(数组末尾),虽然中间位置全空却无法再入队。这种现象叫( )。

(1 分)
第 82 题 G6 未作答

不用循环结构时,顺序队列出队操作的另一种实现是( )。

(1 分)

括号匹配

6 QUESTIONS · 2 POINTS EACH
第 83 题 H1 未作答

下列括号序列中,完全匹配(合法)的是( )。

(1 分)
第 84 题 H2 未作答

括号序列 ((())) 在栈法匹配过程中,栈的最大高度(最大嵌套深度)是( )。

(1 分)
第 85 题 H3 未作答

下列序列中,多种括号匹配正确的是( )。

(1 分)
第 86 题 H4 未作答

括号序列 ((() 至少再添加( )个括号才能变成完全匹配。

(1 分)
第 87 题 H5 未作答

33 对括号能组成的合法括号序列共有( )种。

(1 分)
第 88 题 H6 未作答

用栈法处理括号序列 (()()),处理完全部字符后栈的状态是( )。

(1 分)

栈队列与其他知识的联系

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

函数 f 调用 gg 调用 h。关于返回顺序,正确的是( )。

(1 分)
第 90 题 I2 未作答

递归函数 f(3) 依次调用 f(2)f(1)。递归最深时,函数调用栈中 f 的活动记录有( )层。

(1 分)
第 91 题 I3 未作答

深度优先搜索(DFS)和广度优先搜索(BFS)分别主要借助( )实现。

(1 分)
第 92 题 I4 未作答

BFS 从起点出发逐层向外扩展:第 1 层的邻居先处理完,才会处理第 2 层。保证这种"层次顺序"的数据结构特性是( )。

(1 分)
第 93 题 I5 未作答

用栈判断字符串 abba 是否回文:把前一半 ab 压栈,再逐个扫描后一半与弹出的元素比对。比对结果是( )。

(1 分)
第 94 题 I6 未作答

字符串 abc 的每个字符依次入栈,然后全部弹出输出,得到的是( )。

(1 分)

综合难题

6 QUESTIONS · 2 POINTS EACH
第 95 题 J1 未作答

元素按 3, 1, 2 的顺序依次到达栈。仅借助这个栈,得到输出 1 2 3 的操作序列是( )。

(1 分)
第 96 题 J2 未作答

初始空的栈 S 和队列 P,依次处理 7, 5, 8, 3, 1, 4, 2:奇数压入 S、偶数入 P。全部处理完后先弹尽 S(从栈顶)再出尽 P(从队头),输出序列是( )。

(1 分)
第 97 题 J3 未作答

对初始空栈依次执行:push 1push 2push 3poppush 4push 5poppoppush 6。此时栈中从栈底到栈顶是( )。

(1 分)
第 98 题 J4 未作答

用队列模拟栈时,push 操作的正确做法及其代价是( )。

(1 分)
第 99 题 J5 未作答

两个栈共享一个长度为 mm 的数组:栈 1 的 top11-1 向右增长,栈 2 的 top2mm 向左增长。判"栈满"的条件是( )。

(1 分)
第 100 题 J6 未作答

双栈法求中缀表达式的值(含括号,括号优先级最高)。表达式 (2+3)*4 的值是( )。

(1 分)
拾壹

真 题 演 练

11 QUESTIONS · 真题演练不计分
第 102~107 题 阅读程序 (共 0 分) 未作答

1  #include <cstdio>
2  #include <cstring>
3  using namespace std;
4  char st[100];
5  int main() {
6      scanf("%s", st);
7      int n = strlen(st);
8      for (int i = 1; i <= n; ++i) {
9          if (n % i == 0) {
10              char c = st[i - 1];
11              if (c >= 'a')
12                  st[i - 1] = c - 'a' + 'A';
13          }
14      }
15      printf("%s", st);
16      return 0;
17  }

102.

输入的字符串只能由小写字母或大写字母组成。( )

103.

若将第 88 行的 i = 1 改为 i = 0,程序运行时会发生错误。( )

104.

若将第 88 行的 i <= n 改为 i * i <= n,程序运行结果不会改变。( )

105.

若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样。( )

106.

若输入的字符串长度为 1818,那么输入的字符串跟输出的字符串相比,至多有( )个字符不同。

107.

若输入的字符串长度为( ),那么输入的字符串跟输出的字符串相比,至多有 3636 个字符不同。

CSP-J 2019 · 阅读程序 第16-21题 | 知识点 字符数组、字符ASCII运算、枚举
第 7 题 单选 未作答

下图中所使用的数据结构是( )。图示依次执行“压入 A、压入 B、弹出 B、压入 C”。

(0 分)
CSP-J 2020 · 单选 第11题 | 知识点 栈、栈的应用
第 8 题 单选 未作答

对于入栈顺序为 a, b, c, d, e 的序列,下列( )不是合法的出栈序列。

(0 分)
CSP-J 2021 · 单选 第5题 | 知识点 栈、栈的应用
第 9 题 单选 未作答

表达式 a*(b+c)*d 的后缀表达式为( ),其中 *+ 是运算符。

(0 分)
CSP-J 2021 · 单选 第9题 | 知识点 栈的应用、栈
第 10 题 单选 未作答

66 个元素,按照 665544332211 的顺序进入栈 S,请问下列哪个出栈序列是非法的( )。

(0 分)
CSP-J 2022 · 单选 第2题 | 知识点 栈、栈的应用
第 11 题 单选 未作答

对假设栈 S 和队列 Q 的初始状态为空。存在 e1~e6 六个互不相同的数据,每个数据按照进栈 S、出栈 S、进队列 Q、出队列 Q 的顺序操作,不同数据间的操作可能会交错。已知栈 S 中依次有数据 e1e2e3e4e5e6 进栈,队列 Q 依次有数据 e2e4e3e6e5e1 出队列。则栈 S 的容量至少是( )个数据。

(0 分)
CSP-J 2022 · 单选 第5题 | 知识点 栈、队列、模拟
第 12 题 单选 未作答

对表达式 a+(b-c)*d 的前缀表达式为( ),其中 +-* 是运算符。

(0 分)
CSP-J 2022 · 单选 第6题 | 知识点 栈的应用、栈
第 13 题 单选 未作答

以下对数据结构的表述不恰当的一项为:( )。

(0 分)
CSP-J 2022 · 单选 第10题 | 知识点 栈、队列、图的DFS遍历
第 14 题 单选 未作答

后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀表达式是( )。

(0 分)
CSP-J 2023 · 单选 第8题 | 知识点 栈的应用、栈
第 15 题 单选 未作答

给定一个空栈,支持入栈和出栈操作。若入栈操作的元素依次是 1 2 3 4 5 6,其中 1 最先入栈、6 最后入栈,下面哪种出栈顺序是不可能的?( )

(0 分)
CSP-J 2024 · 单选 第13题 | 知识点 栈、栈的应用
第 16 题 单选 未作答

给定一个初始为空的整数栈 SS 和一个空的队列 PP。我们按顺序处理输入的整数队列 A:7,5,8,3,1,4,2A: 7, 5, 8, 3, 1, 4, 2。对于队列 AA 中的每一个数,执行以下规则:如果该数是奇数,则将其压入栈 SS;如果该数是偶数,且栈 SS 非空,则弹出一个栈顶元素,并加入到队列 PP 的末尾;如果该数是偶数,且栈 SS 为空,则不进行任何操作。当队列 AA 中的所有数都处理完毕后,队列 PP 的内容是什么?( )

(0 分)
CSP-J 2025 · 单选 第15题 | 知识点 栈、双端队列、泛洪算法