信息学奥赛初赛天天练-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个
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习