信息学奥赛初赛天天练-32-CSP-J2022基础题-栈、队列、链表、子串应用

PDF文档公众号回复关键字:20240622

2022 CSP-J 选择题

单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)

1.以下哪种功能没有涉及C++语言的面向对象特性支持 ( )

A. C++中调用printf函数

B. C++中调用用户定义的类成员函数

C. C++中构造一个class 或struct

D. C++中构造来源于同一基类的多个派生类

2 .有6个元素,按照6、5、4、3、2、1的顺序进入栈S,请问下列哪个出栈顺序的非法的( )

A. 5 4 3 6 1 2

B. 4 5 3 1 2 6

C. 3 4 6 5 2 1

D. 2 3 4 1 5 6

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

A. 2

B. 3

C. 4

D. 6

11.以下哪组操作能完成在双向循环链表结点p之后插入结点s的效果(其中,next域为结点的直接后继,prev域为结点的直接前驱 ) ( )

A. p->next->prev=s;s->prew=p;p->next=s;s->next=p->next;

B. p->next->prev=s;p->next=s;s->prew=p;s->next=p->next;

C. s->prew=p;s->next=p->next;p->next=s;p->next->prev=s;

D. s->next=p->next;p->next->prev=s;s->prew=p;p->next=s

14.一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串abcab有( ) 个内容互不相同的子串

A. 12

B. 13

C. 14

D. 15

2 相关知识点

1) 面向对象

C++中,面向对象的概念包括类(class)、对象(object)、继承(inheritance)、封装(encapsulation)、多态(polymorphism)

C语言不具备面向对象的特性

printf属于c语言的内置函数,不涉及C++面向对象的特性

2) 栈

栈又名堆栈,是一种限定仅在表尾进行插入和删除操作的线性表,这一端称为栈顶,另一端称为栈底

栈中的数据元素遵守后进先出的原则

3) 队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作

队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头

队列可以理解成我们平时的排队,先进入的先出去

4) 链表

是一种常见的数据结构,它是由一系列节点(Node)组成,每个节点包含两部分:数据域和指针域。数据域用于存储数据,指针域用于存储下一个节点的地址。链表的第一个节点称为头节点(Head),最后一个节点称为尾节点(Tail),尾节点的指针域指向空(NULL)

单向链表

一种最简单的结点结构如图所示,它是构成单链表的基本结点结构

在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。

因为只有一个指针结点,称为单链表

双向链表

单向链表只有一个方向,结点只有一个后继指针 next 指向后面的结点。

双向链表,顾名思义,它支持两个方向,每个结点不止有一个后继指针 next 指向后面的结点,还有一个前驱指针 prev 指向前面的结点

插入元素

循环列表

单链表最后一个节点的指针指向链表的第1个节点,整个链表形成一个环,从表中任意节点出发均可找到其他点

子序列

一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果

例如

子串

给定串中任意个连续的字符组成的子序列称为该串的子串

3 思路分析

1.以下哪种功能没有涉及C++语言的面向对象特性支持 ( A )

A. C++中调用printf函数

B. C++中调用用户定义的类成员函数

C. C++中构造一个class 或struct

D. C++中构造来源于同一基类的多个派生类

分析

A 中printf函数是C语言函数,C语言是面向过程的语言,不具备面向对象的特性
B 中的用户定义类和类的成员函数是面向对象特性
C 中class是面向对象特性
D 中基类及其继承和派生是面向对象特殊性
所以选A

2 .有6个元素,按照6、5、4、3、2、1的顺序进入栈S,请问下列哪个出栈顺序的非法的( C )

A. 5 4 3 6 1 2

B. 4 5 3 1 2 6

C. 3 4 6 5 2 1

D. 2 3 4 1 5 6

分析

模拟进栈、出栈过程(满足栈的进出原则,后进先出)
A 6 进 5 进 5 出 4 进 4 出 3 进 3 出 6 出 2 进 1 进 1 出 2 出 符合栈后进先出原则
B 6 进 6 进 4 进 4 出 5 出 3 进 3 出 2 进 1 进 1 出 2 出 6 出 符合栈后进先出原则
C 6 进 5 进 4 进 3 进 3 出 4 出 --此时6不能出,因为栈最上面元素是5
D 6 进 5 进 4 进 3 进 2 进 2 出 3 出 4 出 1 进 1 出 5 出 6 出 符合栈后进先出原则
所以选B

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

A. 2

B. 3

C. 4

D. 6

分析

在队列中出队顺序和入队顺序一致,入队顺序和出栈顺序一致,因此求是在给定入栈顺序和出栈顺序的6个元素,栈中存放最多元素个数
栈操作  e1 进 e2 进 e2 出 e3 进  e4 进  e4 出  e3 出  e5 进  e6 进  e6 出  e5  出  e1  出 
栈S容量  0 1     2    1     2      3     2      1      2     3      2      1       0
所以栈中最多3个元素,栈S的容量至少3个

11.以下哪组操作能完成在双向循环链表结点p之后插入结点s的效果(其中,next域为结点的直接后继,prev域为结点的直接前驱 ) ( D )

A. p->next->prev=s;s->prew=p;p->next=s;s->next=p->next;

B. p->next->prev=s;p->next=s;s->prew=p;s->next=p->next;

C. s->prew=p;s->next=p->next;p->next=s;p->next->prev=s;

D. s->next=p->next;p->next->prev=s;s->prew=p;p->next=s;

分析

不能出现一个变量被改过了,然后又用这个改过的变量
A 中 p->next=s;s->next=p->next;//p->next 已经被改指向了s,还赋值给s->next 
B 中 p->next=s;s->prew=p;s->next=p->next;//同A p->next 已经被改指向了s,还赋值给s->next
C 中 p->next=s;p->next->prev=s;//p->next 已经被改指向了s,还使用p->next->prev
D 中没有这种情况,确认D是否正确

D操作具体步骤

1 s->next=p->next;

2 p->next->prev=s;

3 s->prew=p;

4 p->next=s

14.一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串abcab有( B ) 个内容互不相同的子串

A. 12

B. 13

C. 14

D. 15

分析

子串必须是字符串的一部分且必须连续
空中也是子串
总共有如下13个子串
0个字符 空串           1个
1个字符 a b c         3个
2个字符 ab bc ca      3个
3个字符 abc bca cab   3个
4个字符 abca bcab     2个
5个字符 abcab         1个
posted @ 2024-06-22 21:24  new-code  阅读(6)  评论(0编辑  收藏  举报