(PTA)数据结构(作业)7、栈和队列应用,字符串矩阵,树
目录
选择题
编程题
1、7-1 表达式转换 (10 分)
2、7-2 堆栈操作合法性 (10 分)
3、7-3 串的模式匹配 (10 分)
选择题
1、令P代表入栈,O代表出栈。则将一个字符串3*a+b/c
变为3 a * b c / +
的堆栈操作序列是哪个?(例如将ABC
变成BCA
的操作序列是PPOPOO。)
A.PPPOOOPPOPPOOO
B.POPOPOPPOPPOOO
C.POPPOOPPOPOOPO
D.POPPOOPPOPPOOO
示例就是,
ABC在栈外,然后(PP)A B 入栈 ,然后(O)B出栈,就是输出B,(P)C入栈,(OO)C A 出栈。
实质就是一个字符串开始入栈,当栈顶的字符是接下来要输出的字符的时候就出栈,不是就一直入栈
2、令P代表入栈,O代表出栈。当利用堆栈求解后缀表达式1 2 3 + * 4 –
时,堆栈操作序列是:
A.PPPOOPOO
B.PPOOPPOOPPOO
C.PPPOOPOOPPOO
D.PPPOOPOOPPOOPO
PPP:1 2 3 入栈
OO:2 3 出栈参与 + 运算
P:2+3=5 结果入栈
OO:5 1出栈参与 * 运算
PP:5*1=5 和 4 入栈
OO:5 4 出栈参与 - 运算
P:5+4=9 结果入栈
O:9 出栈
3、表达式a*(b+c)-d
的后缀表达式是:
A.a b c + * d -
B.a b c d * + -
C.a b c * + d -
D.- + * a b c d
从左往右写数值,从右往左写运算符,以右括号为分割
4、如果循环队列用大小为m
的数组表示,且用队头指针front
和队列元素个数size
代替一般循环队列中的front
和rear
指针来表示队列的范围,那么这样的循环队列可以容纳的元素个数最多为:
A.m-1
B.m
C.m+1
D.不能确定
size在这里用来判满,所以不用舍弃空间来辅助判满
5、在利用堆栈将下列哪个中缀表达式转换为后缀表达式过程中,堆栈的操作系列为:
push('*') 、push('(')、 push('+')、pop()、pop()、pop()、push('*')、pop()、push('+')、pop()
A.2*(3+4)*5+6
B.2*(3+4*5)+6
C.2*(3+4*5+6)
D.以上都是
6、在一个不带头结点的非空链式队列中,假设f和r分别为队头和队尾指针,则插入s所指的结点运算是( )。
A.f->next=s; f=s;
B.r->next=s; r=s;
C.s->next=s; r=s;
D.s->next=f; f=s;
7、在一个不带头结点的非空链式队列中,假设f和r分别为队头和队尾指针,则删除结点的运算是( )。
A.r=f->next;
B.r=r->next;
C.f=f->next;
D.f=r->next
8、为了减小栈溢出的可能性,可以让两个栈共享一片连续存储空间,两个栈的栈底分别设在这片空间的两端,这样只有当( )时才可能产生上溢。
A.两个栈的栈顶在栈空间的某一位相遇
B.其中一栈的栈顶到达栈空间的中心点
C.两个栈的栈顶同时到达空间的中心点
D.两个栈均不空,且一个栈的栈顶到达另一个栈的栈顶
9、若用一个大小为6的数组来实现循环队列,且当前rear和fornt的值分别为0和3。从当前队列中删除一个元素,再加入两个元素后,rear和front的值分别为( )。
A.1和5
B.2和4
C.4和2
D.5和1
10、在一个顺序存储的循环队列中,若队尾指针指向队尾元素的后一个位置,则队头指针一般指向队头元素的( )。
A.前一个位置
B.后一个位置
C.当前位置
D.后两个位置
11、一个递归的定义可以用递归过程求解,也可以用非递归过程求解,但单从运行时间来看, 通常递归过程比非递归过程( )。
A.较快
B.较慢
C.相同
D.无法确定
12、字符A,B,C依次进入一个栈,按出栈的先后顺序组成不同的字符串,则至多可以组成( )个不同的字符串。
A.14
B.5
C.6
D.8
,代入计算就行了,只限于这种固定顺序随时进出的情况,叫做卡特兰数,具体原理我也不懂,不好说。233333
13、依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( )。
A.a
B.b
C.c
D.d
14、在少用一个元素空间的循环队列(m为最大队列长度)是满队列的条件( )。
A.rear==front
B.(rear+1)%m==front
C.(rear+1)==front
D.front==(front+1)%m
15、若栈S1中保存整数,栈S2中保存运算符,函数F()
依次执行下述各步操作:
- (1)从S1中依次弹出两个操作数
a
和b
; - (2)从S2中弹出一个运算符
op
; - (3)执行相应的运算
b op a
; - (4)将运算结果压入S1中。
假定S1中的操作数依次是{ 5, 8, 3, 2 }(2在栈顶),S2中的运算符依次是{ *
, -
, +
}(+在栈顶)。调用3次F()
后,S1栈顶保存的值是:
A.-15
B.15
C.-20
D.20
16、稀疏矩阵是一种特殊矩阵,其特点为()。
A.行数远远大于列数
B.行数远远小于列数
C.非零元素的个数远远小于零元素的个数
D.零元素的个数远远小于非零元素的个数
矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵(sparse matrix),该比值称为这个矩阵的稠密度;与之相区别的是,如果非零元素的分布存在规律(如上三角矩阵、下三角矩阵、对角矩阵),则称该矩阵为特殊矩阵。
比较基本的定义是矩阵中的大多数元素为零,并且可以利用零元素节约大量存储、运算和程序运行时间。
17、稀疏矩阵在计算机中通常采用()来表示。
A.二叉树
B.二维数组
C.图结构
D.三元组线性表
设m*n 矩阵中有t 个非零元素且t<<m*n,这样的矩阵称为稀疏矩阵。很多科学管理及工程计算中,常会遇到阶数很高的大型稀疏矩阵。如果按常规分配方法,顺序分配在计算机内,那将是相当浪费内存的。为此提出另外一种存储方法,仅仅存放非零元素。但对于这类矩阵,通常零元素分布没有规律,为了能找到相应的元素,所以仅存储非零元素的值是不够的,还要记下它所在的行和列。于是采取如下方法:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。
5.3 稀疏矩阵—稀疏矩阵的三元组表存储_C语言中文网 (biancheng.net)
18、(neuDS_C++)设有两个串p和q,求q在p中首次出现的位置的运算称作( )。
A.连接
B.模式匹配
C.求子串
D.求串长
子串的定位运算通常称为串的模式匹配或串匹配。
19、(neuDS_C++)设串s1=’ABCDEFG’,s2=’PQRST’,函数con (x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,len(s)返回串s的长度,则con (subs (s1,2,len (s2)), subs (s1,len (s2),2))的结果串是( )。
A.BCDEF
B.BCDEFG
C.BCPQRST
D.BCDEFEF
con(x,y)两个参数 对应 subs(s1,2,len(s2))和subs(s1,len(s2),2)
subs(s,i,j) 三个参数 对应 s1,2,len(s2) 和 s1,len(s2),2
对应代入算就好了
20、(neuDS)串的长度是指( )。
A.串中包含的字符个数
B.串中包含的不同字符个数
C.串中除空格以外的字符个数
D.串中包含的不同字母个数
21、(neuDS)设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为( )。
A.求子串
B.联接
C.模式匹配
D.求串长
22、(neuDS)串也是一种线性表,只不过( )。
A.数据元素均为字符
B.数据元素是子串
C.数据元素数据类型不受限制
D.表长受到限制
23、(neuDS)有一个二维数组A[6][8] ,每个数组元素用相邻的6个字节存储,存储器按字节编址,那么这个数组占用的存储空间大小是( )个字节。
A.48
B.96
C.252
D.288
6*8*6=288
24、(neuDS_C++)二维数组A中,每个元素的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,存放该数组至少需要的字节数是( )。
A.80
B.100
C.240
D.270
3*8*10=240
25、(neuDS_C++)二维数组A中,每个元素A的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,该数组按行存放时,数组元素A[7][4]的起始地址为( )。
A.SA+141
B.SA+144
C.SA+222
D.SA+225
SA+(7*10+4)*3
26、下面关于串的叙述中,哪一个是不正确的
A.串是字符的有限序列
B.空串是由空格构成的串
C.模式匹配是串的一种重要运算
D.串既可以采用顺序存储,也可以采用链式存储
空串 (Null String)是指长度为零的串。
27、串的长度是指
A.串中所含不同字母的个数
B.串中所含字符的个数
C.串中所含不同字符的个数
D.串中所含非空格字符的个数
28、完全二叉树的叶子结点数
一棵有 1001 个结点的完全二叉树,其叶子结点数为 ▁▁▁▁▁ 。
A.250
B.254
C.500
D.501
对于任意一个二叉树T,如果其终端节点数为,度为2的结点数为,则
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
完全二叉树,叶子结点是度为2的结点的数量+1,
叶子结点的数量 + 度数为2的结点的数量 + 度数为1的结点的数量= 结点的总数量
29、二叉树的高度
若根节点为高度1,一棵具有 1025 个结点的二叉树的高度为 ▁▁▁▁▁ 。
A.10
B.11
C.11~1025 之间
D.10~1024 之间
按完全二叉树排列,就是>1025,k=11层.
全是度数为1的结点就是1025层。
30、有关二叉树下列说法正确的是( )
A.二叉树的度为2
B.一棵二叉树的度可以小于2
C.二叉树中至少有一个结点的度为2
D.二叉树中任何一个结点的度都为2
31、设某棵二叉树的中序遍历序列为DBEAC,先序遍历序列为ABDEC,则该二叉树的后序遍历序列是( )
A.DBFAC
B.CFDBA
C.DEBCA
D.DBEAC
可以根据先序遍历先确定根节点,然后再中序遍历中以根节点为分界线往两边还原二叉树,然后再去写后序遍历
32、一棵完全二叉树上有2020个结点,其中度为2的结点的个数是( )
A.1010
B.1009
C.1011
D.以上都错
完全二叉树,总数为偶数结点,一定有一个度数为1的结点,减1后,2019 是度数为2的结点和叶子结点的总和,而度数为2的结点 是叶子节点减1.2019-1就是2倍的度数为2的结点
33、深度为6的完全二叉树最少有( )个结点。
A.6
B.31
C.32
D.以上都错
深度为k的二叉树至多有(k1)个结点。
深度为6,最少,所以五层加1,
34、对于先序遍历与中序遍历结果相同的二叉树为( )
A.一般二叉树
B.任一结点均无右孩子的二叉树
C.任一结点均无左子树的二叉树
D.以上都不是
答案似乎是B,因为我选的C,然而实际上就应该是C。
左右根和左根右的结果相同,只能是没有右啊
35、以下二叉树的后序遍历序列是( )。
A.DCEBFHGA
B.CDBEAFGH
C.ABCDEGFH
D.ABGCEFHD
编程题
1、7-1 表达式转换 (10 分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<map>
using namespace std;
stack<char> sign;
char s[22];
map<char, int> mp;
int main()
{// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout);mp['+'] = mp['-'] = 1;mp['*'] = mp['/'] = 2;mp['('] = mp[')'] = 3;scanf("%s", s);int len = strlen(s);bool isfirst = true;for(int i = 0; i < len; i++){if((!i || (i && s[i-1] == '(')) && (s[i] == '+' || s[i] == '-')){if(!isfirst)printf(" ");if(s[i] != '+')printf("%c",s[i]);while(i + 1 < len && (s[i+1] == '.' || (s[i+1] >= '0' && s[i+1] <= '9'))){++i;printf("%c", s[i]);}if(isfirst)isfirst = false;}else if(s[i] >= '0' && s[i] <= '9'){if(!isfirst)printf(" ");printf("%c", s[i]);while(i + 1 < len && (s[i+1] == '.' || (s[i+1] >= '0' && s[i+1] <= '9'))){++i;printf("%c", s[i]);}if(isfirst)isfirst = false;}else if(s[i] == ')'){while(!sign.empty() && sign.top() != '('){printf(" %c", sign.top());sign.pop(); }if(!sign.empty() && sign.top() == '(')sign.pop();}else if(sign.empty() || (mp[s[i]] > mp[sign.top()]))sign.push(s[i]);else {while(!sign.empty() && sign.top() != '('){printf(" %c", sign.top());sign.pop();}sign.push(s[i]);}}while(!sign.empty()){printf(" %c", sign.top());sign.pop();}
}
2、7-2 堆栈操作合法性 (10 分)
假设以S
和X
分别表示入栈和出栈操作。如果根据一个仅由S
和X
构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S
和X
序列,判断该序列是否合法。
输入格式:
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S
和X
构成的序列。序列保证不为空,且长度不超过100。
输出格式:
对每个序列,在一行中输出YES
如果该序列是合法的堆栈操作序列,或NO
如果不是。
输入样例:
4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX
输出样例:
YES
NO
NO
NO
#include <iostream>
#include<string>
using namespace std;int main()
{int m, n;cin >> n>>m;string *str = new string[n];int i = 0;int count = 0;while (i < n){cin >> str[i];i++;}i = 0;while (i<n){int length = str[i].length();int j = 0;count = 0;while (j<length){if (str[i][j] == 'S'){count++;if (count > m){break;}}if (str[i][j] == 'X'){count--;if (count < 0){break;}}j++;}i++;if (count == 0){cout << "YES" << endl;}else{cout << "NO" << endl;}}
}
3、7-3 串的模式匹配 (10 分)
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。
本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:
- 数据0:小规模字符串,测试基本正确性;
- 数据1:随机数据,String 长度为 105,Pattern 长度为 10;
- 数据2:随机数据,String 长度为 105,Pattern 长度为 102;
- 数据3:随机数据,String 长度为 105,Pattern 长度为 103;
- 数据4:随机数据,String 长度为 105,Pattern 长度为 104;
- 数据5:String 长度为 106,Pattern 长度为 105;测试尾字符不匹配的情形;
- 数据6:String 长度为 106,Pattern 长度为 105;测试首字符不匹配的情形。
输入格式:
输入第一行给出 String,为由英文字母组成的、长度不超过 106 的字符串。第二行给出一个正整数 N(≤10),为待匹配的模式串的个数。随后 N 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 105 的字符串。每个字符串都非空,以回车结束。
输出格式:
对每个 Pattern,按照题面要求输出匹配结果。
输入样例:
abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz
输出样例:
abcabcacabxy
Not Found
Not Found
#include<bits/stdc++.h>
char str[1000001];
char str1[1000001];
using namespace std;
int main()
{cin>>str;int n;cin>>n;char *p;for(int i=0;i<n;i++){cin>>str1;if(p=strstr(str,str1)){printf("%s\n",p);}elseprintf("Not Found\n");}
}
其实这个是考KMP的,但是当时不会写,后来勉强看懂一点的时候已经是交作业之后了。
因为我总差一个测试点过不了,垃圾PTA还不跟我说我哪里过不了,实力不够,果咩纳塞。
贴出处的时候发现第一道题出处又找不到了,奇了怪了,我抄过的作业还会自己消失?
(PTA)数据结构(作业)7、栈和队列应用,字符串矩阵,树相关推荐
- SDUT-2449_数据结构实验之栈与队列十:走迷宫
数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...
- sdut 2088 数据结构实验之栈与队列十一:refresh的停车场
数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...
- sdut 1479 数据结构实验之栈与队列九:行编辑器
数据结构实验之栈与队列九:行编辑器 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...
- sdut 3335 数据结构实验之栈与队列八:栈的基本操作
数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...
- sdut 3333 数据结构实验之栈与队列六:下一较大值(二)
数据结构实验之栈与队列六:下一较大值(二) Time Limit: 150MS Memory Limit: 8000KB Submit Statistic Discuss Problem Descri ...
- sdut-3332 数据结构实验之栈与队列五:下一较大值(一)
数据结构实验之栈与队列五:下一较大值(一) Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Desc ...
- sdut 2134 数据结构实验之栈与队列四:括号匹配
数据结构实验之栈与队列四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...
- SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式
数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...
- 计算机队列概念,2020计算机专业考研数据结构知识点:栈、队列和数组
2020计算机专业考研数据结构知识点:栈.队列和数组 1.栈.队列的定义及其相关数据结构的概念,包括:顺序栈.链栈.循环队列.链队列等.栈与队列存取数据(请注意包括:存和取两部分)的特点. 2. 掌握 ...
- 数据结构与算法-栈与队列
数据结构与算法-栈与队列 栈 基本概念 简单表述就是仅在表尾进行插入和删除操作的线性表. 常见操作 入栈和出栈, 均在线性表的尾部进行. 基本原则就是, 先入后出. 队列 基本概念 和栈不同的是,队列 ...
最新文章
- Clone Graph
- local_listener 与 remote_listener 参数说明
- javascript调用在有母版的页面中注意的几点记录
- 13. 找出数组中重复的数字【难度: 简单 / 知识点: 模拟】
- java防止表单重复提交
- App Store 审核指南(中文版)
- IDEA svn 菜单不见了,解决方法
- db2locate函数_DB2常用函数详解
- android action bar 风格,自定义ActionBar的风格
- 【Kafka】Kafka BrokerEndPointNotAvailableException: End point with security protocol PLAINTEXT not
- Facebook广告兴趣定位终极指南经验分享
- nginx 访问图片404_nginx发布vue 项目
- 工程之星位置服务器,工程之星5.0中求坐标转换参数需要谨记这七大点!
- 项目日报模板_速看!贵港这个年产值近100亿元项目即将正式投产
- 使用java映射ipv4,ipv6到阿里DDNS,适用于黑白群晖或其他用途
- 功能机用上下键实现MoveEvent
- WPS打卡领会员活动题目及答案
- 简单的C语言顺序结构例题介绍
- 多线程ADSL切换IP
- python练习题:程序员问卷调查