资源简介 第三章 字符串、队列和栈课时1 字符串一、基础巩固1.已知x=″2.0+3=5.0″,下列表达式成立的是( )A.len(x)==8 B.x[0]>x[2]C.x[:2]==″2.0″ D.x[6::]==″5″2.字符串变量s=″2022jiaxing″,则表达式s[1:len(s)∥2]+s[2]*2的值是( )A.″20224″ B.″2026″ C.″022j22″ D.″022j4″3.通过键盘输入一串字符串,程序输出该字符串的所有子串。例如,下面程序段当输入“the”时,将输出['t','th','the','h','he','e']。s=input(″请输入一个字符串:″)a=[]for i in range(len(s)): for j in range((1)________________):a.append((2)________________) print(a)为实现上述功能,上述程序段(1)(2)处的语句分别是( )A.①i,len(s) ②s[i:j+1]B.①i,len(s)-i+1 ②s[i:j+i]C.①i,len(s)-i+1 ②s[i:j+1]D.①i,len(s) ②s[j:j+i]4.某RGB色彩模式图像信息存储在文本文件中,文件的一行存储图像的一个像素,现对图像中连续的0或1进行压缩,某个像素的压缩算法如下:def change(s): #对连续多个0或1进行压缩,字符串s中不含换行符 i=1;j=0;result=″″ sd=″0123456789ABCDEF″ while i while i i+=1 d=i-j s1=s[j]+sd[d%16] if d>16: s1=s[j]+sd[0]+s1 result+=s1 j=ireturn result若某个像素点的信息为“111100000000000000000001”,则压缩后的信息为( )A.41003011 B.140003 C.14000311 D.140F04115.有如下程序段:s1=″232″s2=″abcdef″for i in s1: m=int(i) c=s2[m:m+1] s2=s2[1:m+1]+c+s2[m+1:]print(s2)执行该程序段后,变量s2的值是( )A.″eef″ B.″cdddef″ C.″dcdcdcdef″ D.″abccccdef ″6.有如下程序段:s=″aabbbcc″i=3while ij=i-2if s[i-1]==s[i] and s[j]==s[j-1]: s=s[:i]+s[i+1:]else: i+=1print(s)执行该程序段后,变量 s 的值是( )A.″abc″ B.″aabbc″ C.″aabc″ D.″aabcc″7.有如下 Python 程序段:s=″5A9C3B0E7D″ans=″″; i=0while s[i]!=″0″: t=int(s[i]) ans+=s[t] i=t-1print(ans)运行该程序段后,变量 ans 的值是( )A.″BCDEA″ B.″BCD″ C.″ABCD″ D.″BCDE″二、能力提升8.下列 Python 程序段功能为:输入由英文字母组成的字符串,若字符串中有连续升序段(相邻字符 ASCII 码值增量为 1),则把该升序段缩写为“首字符-尾字符”构成的新字符串。例如:字符串为“abcbxy”,则缩写成“a-cbx-y”。s=input(″请输入字符串:″)k=len(s);flag=False;result=″″for i in range(0,k-1): if ①________________ : result=result+s[i]+″-″ flag=True elif ord(s[i])!=ord(s[i+1])-1: result=result+s[i] flag=False②________________print(″缩写后的字符串为″,result)则划线处应填入的代码为( )A.①ord(s[i])==ord(s[i+1])-1 and flag ②result=result+s[i]B.① ord(s[i])==ord(s[i+1])-1 and not flag ②result=result+s[i]C.① ord(s[i])==ord(s[i+1])-1 and flag ②result=result+s[i+1]D.① ord(s[i])==ord(s[i+1])-1 and not flag ②result=result+s[i+1]9.某字符串s是由一个原始字符串反复重叠形成的。例如字符串″abcababcababcab″的是由原始字符串″abcab″重叠而成。检测的算法:将该字符串划分成若干段,若字符串每一段与第一段相同,则认为该字符串是由这段字符重叠而成。为查找字符串s的原始字符串,有如下程序段:s=″abcababcababcababcababcab″n=len(s);ans=″″for i in range(1,n∥2+1): if ①________________ for j in range(i,n,i): if ②________________ break else: ans=s[:i]print(″原始串是:″,ans)将划线处填写完整。10.有Python程序段如下:s='I Love You HangZhou!'s1=''for i in range(0,len(s),3): c=s[i] if ord(c)>=ord('a'): c=chr(ord(c)-ord('a')+ord('A')) s1=c+s1print(s1)程序运行后,输出的值是( )A.OUAZU B.OUAU C.UZAUO D.UAUO11.有如下Python程序段:s=″abbaddcab″k=0;r=″″b=[″″]*6for i in s: if i==b[k]: k-=1 else: k+=1 b[k]=ifor i in range(1,k+1): print(b[i],end=″″)执行该程序段后,输出的内容是( )A.abdc B.aacab C.c D.cab12.判断两个字符串是否相等:规定字符“?”为万能字符,即可与任意一个字符相等,在忽略字符串中空格以及不区分大小写的前提下,判断两个字符串是否相同。Python程序运行界面如图所示。请输入一个字符串:?? a d ??dad wd 请输入另一个字符串:a a c?d?d w 两个字符串相同(1)根据以上规则字符串’??ad??dad wd’和字符串’a???c?d?d?d’是否相等____(填:是/否)。(2)实现上述功能的Python程序如下,请在划线处填入适当的代码。s1=input(″请输入一个字符串:″)s2=input(″请输入另一个字符串:″)s1=s1.upper()s2=s2.upper()s=″″#将字符串s1中的空格去掉for i in s1:if i !=″″:①________________s1=s#同上,将字符串s2中的空格去掉,代码略i=0if len(s1)!=len(s2):print(″两个字符串不相同″)else:while i c1=s1[i];c2=s2[i] if c1==c2: ②________________ else: if ③________________: i+=1 else: breakif i==len(s1):print(″两个字符串相同″)else:print(″两个字符串不相同″)13.小张参加学校举行的密码破解攻防比赛,他需要在规定时间破解对手密码。比赛时,小张发现对方密文可能采用凯撒加密,这是一种简单且广为人知的加密技术,方法是将明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文,非字母保持原状。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,Z变成C,以此类推。小张为了增加破解难度,决定在凯撒加密基础上,引入密钥字符串,密钥字符及对应的偏移量如下表所示,密钥字符串长度不够时,可循环使用。密钥 A B C D E F G H I J K L M偏移量 0 1 2 3 4 5 6 7 8 9 10 11 12密钥 N O P Q R S T U V W X Y Z偏移量 13 14 15 16 17 18 19 20 21 22 23 24 25例如:若输入明文为:Hello,输入密钥为:ABC,则得到密文为:Hfnlp(1)若明文:ZhouShan密钥为:LOVE,则密文为:________(2)引入密钥后的加密算法的Python程序代码如下:def change(x):ek=[]for c in x: if ' a'<=c<='z': ①________ elif ' A'<=c<='Z': #与小写字母相似处理,代码略return eks=input(″输入原文:″)key=input(″输入秘钥:″)keyn=change(key)ch=″″for i in range(len(s)):k=keyn[②________]if ' a'<=s[i]<='z': ch=③________ result=result+chelif 'A'<=s[i]<='Z': #与小写字母相似处理,代码略else: result=result+s[i]print(result)(2)在划线处填写合适代码,完善程序。(3)程序调试过程中,出现如下错误提示“NameError:name' result' is not defined”,产生此错误的原因是___________________________________________________。14.查找包含26个小写字母的最短字符串:输入任意一串包含小写字母的字符串(长度n>=26),要求找到长度最小的一段区间,能够包含全部26个小写英文字母。小王设计了Python程序用于搜索最短字符串,若无解,则输出“无解!”,反之输出该最小区间的长度以及字符的开始位置,并输出相应的最短字符串,程序界面如图所示:请输入字符串内容:wurfabcdefghijklmnopqrstuvwxyzzsdf 包含26个字母的字符串为:abcdefghijklmnopqrstuvw 最短长度:26 开始位置:4本题的算法思想是:①确定初始右边界:从第1个字符开始,向右搜索到包含全部26个字母的子串,并因此而确定右边界,同时记录每个字母在子串中出现过的次数。②调整子串左边界:若左边界有重复的字母则表明该子串可缩短,故左边可右移1位,……直到找到一个符合条件的子串并记录,然后子串左边界再右移1位。③调整子串右边界:子串右边界继续右移,在新子串符合条件后,记录并进行比较。重复②各调整步骤,直至遍历完整个字符串,获得并输出满足条件的最小长度字符串。实现上述功能的Python程序如下,请回答下列问题。text=input(″请输入字符串内容:″)n=len(text)s=[0 for i in range(n)]for i in range(n):①________________res=″″k=left=pos=0length=nf=[0]*26for i in range(n):if f[s[i]]==0: k=k+1f[s[i]]=f[s[i]]+1while ②________________:f[s[pos]]=f[s[pos]]-1if ③________________: k-=1 if i-pos+1 length=i-pos+1 res=text[pos:pos+length] left=pospos+=1if res !=″″:print(″包含26个字母的字符串为:″,res)print(″最短长度:″,length,″开始位置:″,left)else:print(″无解!″)(1)对于字符串“abfabcfdeefed”,包含字母“abcdef”的最短字符串长度为________(填数字)。(2)请在划线处填入合适的代码。课时1 字符串1.B [本题主要考查的是字符串的函数及基本运算。len(x)的值为9,因此A选项错误;x[:2]的值为″2.″,因此C选项错误;x[6::]的值为″5.0″,因此D选项错误;x[0]的值为″2″,x[2]的值为″0″,因为″2″>″0″,因此x[0]>x[2],故答案为B。]2.C [本题主要考查的是字符串切片和运算。s[1:len(s)∥2]表示从第2个字符位置取到中间位置的前一个字符,结果为“022j”,s[2]*2表示索引第3个字符“2”重复2次,结果为“22”,最后连接两个字符串,因此,答案为C。]3.A [本题考查双重循环和字符串的切片。i表示切片的开始位置,j表示切片的结束位置。]4.C [本题考查字符串处理。变量j表示出现相同字符的起点位置,变量i表示结束位置后面第1个位置,s[i]==s[i-1]表示有多个重复,s[j]==s[i]表示单个,不重复。d表示重复的长度,由于一个点的像素,长度为24个二进制位,当d>16条件成立时,d∥16-1的值为0。字符串中包含4个1,19个0和1个1。]5.B [本题考查字符串的切片。s2的值从″bccdef″、″ccddef″变化到″cdddef″。]6.D [本题主要考查字符串的处理,即字符的比较和字符的删除操作。变量s从″aabbcc″变化到″aabcc″。]7.D [变量t的值依次为5,3,9,7,对应s[t]的值依次为B、C、D、E。当i的值为6时,s[i]的值为0,结束循环。]8.D [本题考查字符串操作。①语句result=result+s[i]+″-″是连接首字母,接着flag为True,因此flag表示是否找到起点,该空表示的是连续升序且为起点。②循环的条件for i in range(0,k-1),只处理前k-1个字符,最后一个字符没有处理。]9.①n %i==0 ②s[j:j+i]!=s[:i]解析 本题考查双重遍历的算法思想。一个原始字符串反复重叠,该原始字符串长度必定能被n整除,条件n %i==0成立表示该长度i是n的因子,可能是原始字符串s[:i+1]的长度,字符串s从第0个位置开始,到i-1位置是原始字符串,从i开始,每i个长度的字符串s[j:j+i]是否是原始字符串,如果不是说明这段中不符合原始字符串。10.D [本题考查range函数的使用以及程序基本代码的阅读能力。根据range函数的参数,是从字符串s中从索引0开始,依次取出下标为0、3、6……位置的字符,如果字符是小写,将它转为大写,并按逆序依次拼接。答案为D。]11.D [本题考查程序结构的灵活应用。程序算法为:依次从左向右提取s中每一个字符,如果与b[k]中字符不一致,则将该字符存储到b[k+1]中,如果一致,则k=k-1。]12.(1)是 (2)①s=s+i ②i+=1 ③c1==″?″ or c2==″?″解析 本题主要考查字符串的综合应用。(1)依照题意,‘?’作为万能字符与任意字符相等,问题中的两个字符串依次比较是相等的。(2)填空①处实现去掉字符串s1的空格,所以遍历字符串时为非空格的时候,进行字符的连接,因此①处答案是s=s+i;填空②处当遍历至相同位置的字符相等时,则进行下一个位置的字符比较,因此②处答案是i+=1;填空③处当两个相同位置的字符不相等时,则考虑“?”作为万能字符情况,因此③处答案是c1==″?″ or c2==″?″。13.(1)KvjyDvvr (2)①ek.append(ord(c)-ord(″a″)) ②i%len(keyn) ③chr(ord(s[i])-ord(″a″)+k)%26+ord(″a″)) (3)变量result没有赋初始值解析 本题主要考查字符串的综合应用。(1)根据表中提供数据,密钥LOVE对应的偏移量分别是11,14,21,17,可得ZhouShan的密文是KvjyDvvr;(2)①自定义函数change(x)将密钥字符转成对应的偏移量,结果存放在数组ek中,根据表中字母对应的偏移量,所以此处应填ek.append(ord(c)-ord(″a″));②遍历明文字符应取密钥列表中的每一个偏移量,由于密钥长度可能小于明文长度,需循环使用,所以此处应填i%len(keyn);③将原字符的字母按照密钥的偏移值进行位移,由于需在字母范围内进行循环位移,因此此处答案为chr(ord(s[i]-ord(″a″)+k)%26+ord(″a″));(3)在python中变量没有赋初始值,表示没有定义。14.(1)6 (2)①s[i]=ord(text[i])-97或s[i]=ord(text[i])-ord(″a″) ② k>=26 或 k==26 ③f[s[pos]]==0解析 本题主要考查字符串的综合应用。(1)包括字母“abcdef”的最短字符串为“abcfde”,长度为6。(2)①处代码表示求每个输入的小写字母在字母表中的位置,其中字母“a”的位置为0,其他字母依次类推,因此①处代码为s[i]=ord(text[i])-ord(″a″),小写字母a的ASCII为97,故也可以写为s[i]=ord(text[i])-97;②处代码表示当前字符串已包含26个字母时的处理, 变量k表示字母的种类数,如果字符串中已包含26个字母,则进行优化处理,看能否调整字符串的左边界,因此②处代码为k>=26或 k==26;③处代码表示条件左边界不能再调整的情况,表示该子串不可再缩短,因此③处代码为f[s[pos]]==0。课时2 队 列一、基础巩固1.下列有关队列的说法正确的是( )A.队列是一种先进先出的线性表,插入一端为队首,删除一端称队尾B.队列的存储结构,可用数组实现,也可用链表实现C.一队列队头指针head,队尾指针tail,则tail-1-head表示队列中元素个数D.学生排队就餐与软件连续撤消操作都是数据结构“队列”的应用实例2.有1个队列,现有元素依次为1,2,3,4。约定:P操作是指1个入队,T操作是指队列中1个元素出队后再入队,Q操作是指队列中1个元素出队。则经过PPTQTPQ系列操作后,队列中队首到队尾的元素依次为( )A.1 B.1,3 C.3,4 D.33.创建一个容量为 3 的队列,元素 2,3,5,1,3,5,2 依次等待入队。入队规则为:①若当前待入队元素已经在队列中,则跳过该元素,否则转②②若当前队列已满,将队首元素出队列,否则转③③将当前待入队元素入队列操作完成后,队列中的元素为( )A.2,3,5,1 B.1,2,3,5C.2,3,5 D.5,1,24.某种特殊的队列 Q,支持以下3个操作:操作Q1,若队列非空,队首元素出队,并输出;操作Q2,若队列非空,队首元素出队;操作Q3,一个元素入队;以上任意一种操作后,若队列非空,新的队首元素仍为队列中所有元素的最小值。若队列 Q 初始状态为空,依次进行 Q3、Q2、Q1、Q2、Q3、Q1、Q3 七次操作后,下列说法正确的是( )A.当前队列中的元素个数为 2B.输出的元素个数为 2C.第一个输出的元素肯定比当前队首元素大D.队列初始状态是否为空对输出结果有影响5.假设队列空间足够,队列中的元素个数为 5。约定:T 为入队操作,Q 为出队操作,则经过 TTQQTQTQQ一系列操作之后,队首指针 head,队尾指针 tail 的值可能为( )A.head=11,tail=7 B.head=7,tail=11C.head=9,tail=12 D.head=12,tail=96.列表q长度为20,q[0]到q[7]的值依次为'a','b','c','a','c','d','d','e',执行如下程序段后,输出的结果为( )head=tail=0for i in range(8):if q[i]==q[head] and head!=tail: tail+=1 head=tailelse: tail+=1print(q[head:tail])A.cdde B.acdde C.eddc D.e7.有如下程序段:m=3;n=7head=tail=0;ans=0vis=[0]*10;q=[0]*10for i in range(n): x=int(input()) if (vis[x]==0): ans+=1 if (tail-head>=m): vis[q[head]]=0 head+=1 q[tail]=x tail+=1 vis[x]=1print(ans)运行该程序段,依次输入x的值:1,2,1,5,4,4,1。则程序运行完成后ans的值是( )A.3 B.4 C.5 D.68.执行如下程序段后,输出的结果是( )q=[6,8,9,7,4,5,2,3]pre=10head,tail=0,len(q)while head!=tail: if pre>q[head]:pre=q[head]print(q[head],end=' ')head+=1A.6 8 9 B.6 4 2 C.6 5 3 D.69.有如下Python程序段:a=[3,6,10,5,9,4]q=[0]*len(a)k=int(input(″输入k的值:″))head=tail=0s=ans=0for i in a: q[tail]=i tail=tail+1 s+=i if ansans=s while ik:s-=q[head]head=head+1执行该程序段后,输入k的值为2,变量ans的值是( )A.18 B.19 C.21 D.22二、能力提升10.有如下Python程序段:Q=[0]*10cnt,head,tail=0,0,0S=input()for i in range(0,9,2): t=S[i] n=int(S[i+1]) if t=='A': for j in range(n): Q[tail]=cnt tail+=1 cnt+=1elif t==″D″: while head!=tail and n>0: head+=1 n-=1print(Q[head : tail])若输入S的值为″A2D1A1D3A2″,则程序的输出结果是 ( )A.[3,4,5] B.[3,4] C.[4,5] D.[4]11.有如下程序段:s=input()head=0; tail=0; ans=0; tmp=″q=[″]*100flag=Truefor i in range(len(s)): if s[i]==',':while head!=tail: tmp+=q[head] head+=1 if flag and head head+=1 flag=not flag ans+=int(tmp) tmp=″; flag=True elif '0'<=s[i]<='9': q[tail]=s[i] tail+=1若输入s为“1-500,2023900-,”,执行该程序段,变量ans的值为( )A.100 B.22300 C.22351 D.2240012.某市举办科技嘉年华活动,为了激发学生的参与积极性,举办方推出了玩游戏得积分,积分兑换礼物的活动。活动中游戏分为简单和困难两种,参与游戏就可以获得相应的积分,当完成困难游戏时,除了获得相应积分外,还可获得一张“积分翻倍卡”,一张“积分翻倍卡”可用于一个简单游戏,使简单游戏的积分翻倍。“积分翻倍卡”使用规则如下:1)当简单游戏开始时,如果有“积分翻倍卡”可用,则一定会使用。2)“积分翻倍卡”需在15分钟内使用。比如困难游戏完成时间是9:15分,则获得的“积分翻倍卡”将在9:15分激活,且超过9:30分将失效。3)如果有多张“积分翻倍卡”,则优先使用最早的“积分翻倍卡”。某同学的游戏记录如图a所示(类型0表示困难游戏,类型1表示简单游戏),小明读取游戏记录,编写Python程序计算出该同学游戏的最终得分。程序运行结果如图b 所示,请回答下列问题:序号 类型 积分 开始时间 完成时间1 0 10 9:10 9:152 1 3 9:15 9:283 1 5 9:38 9:424 0 12 9:58 10:055 1 3 10:20 10:366 0 15 10:48 10:557 1 3 11:25 11:29图a(1)若某同学参加游戏的记录如图c所示,则他获得的积分是________分。(2)定义如下函数 change(t),参数t为游戏时间,函数功能是将时间t转换为分钟并返回。如:t=″9:20″时,转换为整数(分钟)值是560,函数返回值为560。函数代码如下,请在划线处填入合适的语句。def change(t): #参数t的时间格式为:″小时:分钟″m=t.split(″:″) s=____________return s(3)计算游戏积分的部分Python程序如下,请在划线处填入合适的代码。从Excel文件中读取游戏过程记录,存储在列表s 中,如s=[[1,0,10,550,565],[2,1,3,565,568],...],s[i]表示第i个游戏记录,s[i][0],s[i][1],s[i][2],s[i][3],s[i][4]依次存储游戏的序号、类型、积分、开始时间,完成时间;当游戏类型s[i][1]值为日时表示困难游戏,为1则表示简单游戏;将困难游戏取出存入列表a中,列表 a按游戏完成时间升序排序;将简单游戏取出存入列表b中,列表b按游戏开始时间升序排序,代码略que=[-1]*(len(a)+len(b)+1)head=tail=0total=0for i in range(len(a)): #累加游戏积分,将“积分翻倍卡”激活时间加入队列total+=a[i][2]①____________tail+=1for i in range(len(b)) : while head print(que[head]∥60,″: ″,que[head] % 60,″时刻生效的″+″积分翻倍卡过期;″) head+=1 if head print(b[i][3]∥60,″:″,b[i][3]%60,″时刻使用了积分翻倍卡;″) ③____________ head+=1 else: total+=b[i][2]print(″总共获得积分为: ″,total,″分,″,″剩余积分卡有: ″,tail-head,″张。″)13.某文本编辑软件可以把所做的文本编辑操作记录下来,并通过撤销和恢复命令来撤销一步操作或恢复一步撤销的操作,也可以通过数字命令一次性撤销最近的多步文本编辑操作,如图所示。设计算法模拟该功能。约定:①操作记录只存储文本编辑指令;②存储步数最多为 5步,存满后早期的操作记录将被覆盖;③程序只显示操作记录的可“撤销”记录,可 “恢复”记录不显示;④一旦有新的文本编辑操作,则清空所有可“恢复”记录。人机交互的指令如下(所有操作示例都基于上一个示例结果继续操作):类型 指令 示例 程序输出结果文本 编辑 “T1”、“T2”、“T3”、“T4”表示四种文本编辑操作 对文本依次做“ T1 ” 、 “T2”、“T3”、“T4” 操作后,再输入指令“T2” 请输入操作指令:T2 指令B可用:指令F不可用 可撤销记录:T1/T2/T3/T4/T2/撤销 “B”表示撤销 1 步操作 输入“B” 结果:撤销最近一步操作 “T2” 请输入操作指令:B 指令B可用:指令F可用 可撤销记录:T1/T2/T3/T4/数字“1”~“5”表示撤销多步操作 输入“3” 结果:撤销最近 3 步操作 “T4”、“T3”和“T2” 请输入操作指令:3 指令B可用:指令F可用 可撤销记录:T1/恢复 “F”表示恢复 1 步撤销的文本编辑操作 输入“F” 结果:恢复最近的 1 步文本编辑操作“T2” 请输入操作指令:F 指令B可用;指令F可用 可撤销记录:T1/T2/文本 编辑 在撤销或恢复操作之后继续新的文本编辑操作 输入“T1” 结果: 可“ 恢复” 记录 “T3”、“T4”、“T2” 被清空 请输入操作指令:T1 指令B可用;指令F不可用 可撤销记录:T1/T2/T1/所有指令均可使用多次。每次输入一个指令后都输出“F”指令和“B”指令是否可用以及当前可撤销记录。所有无效操作指令输入后均提示“Input Error!”。输入“#”则结束程序。请回答下列问题:(1)由题意可知,当依次执行指令“T2”、“T2”、“T1”、“T3”、“T1”、“T4”,则最终可撤销记录共有__________个。(2)模拟实现该功能的 Python 代码如下,请在划线处填入合适的代码。def printh(head,cur): print(f[flag[0]*2+flag[1]]) s=″可撤销记录:″ while head!=cur+1: s=s+hist[head]+″/″ ①____________ print(s)opera=[″T1″,″T2″,″T3″,″T4″]f={0:″指令 B 不可用;指令 F 不可用″,1:″指令 B 不可用;指令 F 可用″,2:″指令 B 可用;指令 F 不可用″,3:″指令 B 可用;指令 F 可用″}maxn=5 #历史记录最多存储的步数maxsize=100 #设定最多输入文本编辑指令 100 次hist=[″″]*maxsizecur=-1;tail=0;head=0flag=[0,0] #记录指令 B 与指令 F 的状态while True: d=input(″请输入操作指令:″) if d==″#″: break if d in opera: if ②____________: head=head+1 cur=cur+1;hist[cur]=d tail=cur+1 flag=[1,0] printh(head,cur) elif ″1″<=d<=str((cur-head+1)): cur=③____________ if cur==head-1: flag[0]=0 flag[1]=1printh(head,cur) elif d==″F ″and tail!=cur+1: #恢复功能代码略 elif if cur==head: flag[0]=0 flag[1]=1cur=cur-1 printh(head,cur) else: print(″Input Error! ″)(3)若加框处代码误写为“d==″B″”,会导致某些情况下无法得到符合判断功能的结果。下列 4 组数据中能测试出这一问题的是__________(多选,填字母)选项 依次输入下列操作指令A “B”B “T1”、“B”、“B”C “T1”、“1”、“B”D “T1”、“T2”、“B”课时2 队 列1.B [本题考查队列的性质。A选项队列在队尾插入,在队首删除;C选项队尾指针tail指向队尾元素的下一个位置,所以tail-head表示队列中元素个数;D选项软件连续撤销操作是撤销前一步操作,是栈的应用实例。]2.D [元素1,2入队,1出队后入队,队列为2,1。2出队,1出队后入队,3入队,1出队,因此队列中只有元素3。]3.D [本题考查队列性质。2,3,5入队,队满。2出队,1入队,队列为3,5,1;3和5在队列中,跳过该元素。3出队,才能让2入队,队列中元素为5,1,2。]4.D [操作Q3、Q2之后,队列为空。Q3、Q1,队列为空。因此队列中元素个数为1,Q1操作出队并输出元素,输出的元素个数为1。C选项没有可比性。D选项若队列不为空,则Q3、Q2、Q1、Q2输出的结果不一样。]5.B [本题考查队列基本操作。经过4次入队,5次出队,因此队列中共有4个元素。由于队列空间足够,因此队尾指针大于队首指针。A选项队尾应大于队首。B选项队列中元素个数为11-7=4,符合题目要求。C选项队尾应大于队首。D选项队列中元素个数为12-9=3,不符合题目要求。]6.A [分析程序段可知,该程序段实现的是一种消消乐游戏,即若新遍历到的元素和队首的元素不同或者队列为空,则将新元素入队。若新遍历到的元素和队首的元素相同,则将所有队列中的元素清空。因此队列中最后剩余的元素为 c,d,d,e。]7.C [本题考查队列的算法实现。vis是一个标志数组,当其元素值为0时,可以入队,保证队列中数据是唯一的。当队列中元素个数大于等于3时,将进行出队操作。ans统计入队次数。输入x的值1,2入队,接着1不能入队,5入队,当输入4时,让1出队,4入队。第2个4不能入队,最后一个1入队。]8.B [本题考查队列的基本操作。程序的功能是查找队列中最小值,pre初值为10,每次出队一个元素,出队元素与pre比较,记录其最小值的过程。]9.C [遍历数组a并累加数组元素值,求队列的最大值;当遍历到的当前值小于队首或是长度大于k,将队首元素出队。s的值依次为[3,6,10]=19,[6,10,5]=21,[5,9]=14,[5,9,4]=18。]10.B [本题考查队列的入队与出队操作。字符串S中两个字符为一组,第1个元素t代表入队或出队,第2个元素代表n入队或出队的次数。A是入队,D是出队,若出队过程中队空,则中止出队。]11.D [本题考查队列的程序实现。在for循环中,当s[i]的值为数字字符时,将s[i]放入队列中;当s[i]为’,’时,将队列中的字符出队并连接。当flag为True时,字符出队但不连接到tmp中;其余字符忽略不处理。因此当输入的字符串为“1-500,2023900-,”时,遇到第一个’,’字符,则ans加上100,然后再对于进入队列中的字符串“2023900”进行计算,故最后的结果为22400。]12.(1)40 (2)int(m[0])*60+int(m[1]) (3)①que[tail]=a[i][4] ②que[head]+15解析 本题考查队列的基本操作。(1)完成困难游戏获得积分翻倍卡,一张积分翻倍卡使简单游戏的积分翻倍,但积分卡在15分钟内有效,14:47激活卡,15:10已经过期。积分为10+5*2+15+5。(2)将时间按冒号分隔,得到一个列表,列表中有两个值,分别为m[0]和m[1]。(3)①将积分卡激活时间加入队列,困难游戏完成时间就是卡激活时间。②遍历列表b,简单游戏一开始就可以使用翻倍卡,因此计算翻倍卡的激活时间与当前简单游戏开始时间的时间差,该时间差大于15分钟时,卡失效。③使用翻倍卡,积分将翻倍。13.(1)5 (2)① head+=1 ②cur-head+1==maxn或tail==cur+l and tail-head==maxn ③cur-int(d) (3)ABC解析 本题考查队列的基本操作。(1)存储步数最多为 5步,存满后早期的操作记录将被覆盖。(2)①head表示队首,cur表示最后一个元素指针,每输出一个元素,就要出队。②当d是文本编辑指令时,存储步数最多为 5步,超出队首元素将不能撤消。cur初值为-1,一个元素入队后,值为0,因此cur表示列队中最后一个元素,因此队列总共元素个数为cur+1-head。③当d为撤消步数时,cur表示撤消后的元素位置,因此cur将减去int(d)的值。(3)A选项cur小于head无法输出。B选项撤消一步后,效果同A。C选项1表示撤消一步,效果同B。D选项有两个元素,可以输出。课时3 栈一、基础巩固1.栈s的最大长度为4,初始已有两个元素在栈内,栈底为a,栈顶为b,经过一系列入栈、出栈操作,若元素入栈的顺序是c,d,e,f,则可能的出栈序列为( )A.c,a,b,e,f,d B.b,d,f,e,c,aC.a,b,d,c,e,f D.b,e,f,c,d,a2.有一个队列和一个栈,其中队列中队首到队尾的元素依次为3,15,8,7,栈中栈顶到栈底的元素依次为6,9,12,10。现在有两种操作,操作S是指队列中1个元素出队后入栈,操作Q是栈中1个元素出栈后入队。则经过QSSQSQQS操作后,队列中队首到队尾的元素依次是( )A.6,15,8,3 B.10,15,8,3C.3,6,15,7 D.3,10,15,73.用“除二取余”法将十进制转换为二进制数,用栈的方法操作,需要把得到的余数依次入栈,除尽后再把余数出栈即可。若要将十进制数n(0≤n<64)转换为二进制数,则设置栈的长度至少为( )A.3 B.4 C.5 D.64.已知栈k的入栈顺序为2,7,3,1,6,9,第2个出栈的是6,第5个出栈的是2,则最后出栈的元素是( )A.7 B.3 C.1 D.95.已知字符“a”的ASCII码值为97,有如下Python程序段:que=[″″]*20head,tail=0,0for i in range(3): que[tail]=chr(97+i) tail+=1st=[″b″,″c″,″d″,″a″]top=3while head-1: if st[top]==que[head]:head+=1 else:que[tail]=st[top]tail+=1 top-=1print(que[head:tail])执行该程序段,则输出的结果是( )A.['c','d','c'] B.['c','c','d']C.['c',″,'d'] D.['c','d']6.用栈的思想编写进制转换中的“除二取余法”的Python程序如下:st=[-1]*100top=-1n=int(input(″请输入一个十进制数″))while n>0:n∥=2while top!=-1: print(st[top],end=″″) top-=1方框处的代码由以下三条语句组成:①st[top]=x ②x=n%2 ③top+=1下列语句顺序正确的是( )A.①②③ B.①③② C.②①③ D.②③①7.有如下Python程序段:s=input(″请输入一个仅由小写英文字母组成的字符串:″)st=[″″]*len(s)top=-1t=[-1]*26for i in range(len(s)): id=ord(s[i])-97 if t[id]==-1: top+=1 st[top]=s[i] t[id]=top else: first=t[id] while top>=first and top!=-1: num=ord(st[top])-97 t[num]=-1; top-=1print(st[:top+1])若从键盘输入的值为″hellopython″,则输出的值为( )A.['o','n']B.['h','e','n']C.['h','e','l','o','p','y','t','n']D.['h','e','o','p','y','t','h','o','n']8.有如下Python程序段:import randoms=[3,2,7,6,9]st=[0]*len(s)top=-1;i=0while i op=random.randint(0,1) if top==-1 or op==0 and s[i]>st[top]: top+=1 st[top]=s[i] elif top>=1 and op==1 and s[i]>st[top-1]: st[top]=s[i] i+=1while top!=-1: print(st[top],end=″ ″) top-=1执行该程序段后,输出的结果不可能是( )A.3 B.9 6 2 C.9 6 3 D.9 7 39.如下Python 程序段的功能是判断一个表达式中的括号(只有小括号)是否匹配,exp=input(″请输入表达式:″)top=-1;n=len(exp)∥2;flag=Truestack=[″″]*nfor ch in exp: if ch==″(″: if ①____________: flag=False;breaktop+=1;stack[top]=″(″ elif ch==″)″: if top<0: flag=False;breaktop-=1if ②____________: print(″括号匹配″)else: print(″括号不匹配″)则划线处应填入的代码是( )A.① top>=n ② flag and top==0B.① top==n-1 ② flag and top==0C.① top>=n ② flag and top==-1D.① top==n-1 ② flag and top==-1二、能力提升10.某栈入栈序列为“A、B、C、D、E”,若第一个出栈的元素为“C”,最后一个出栈的元素为“E”,则可能的出栈序列有( )A.3种 B.4种 C.5种 D.6种11.有如下 Python 程序:s1=[0]*5; s2=[0]*5; top1=-1;top2=-1a=[9,2,5,6,1]for i in range (len(a)): while top1!=-1 and a[i] top2+=1 s2[top2]=s1[top1] top1-=1 top1+=1; s1[top1]=a[i] while top2!=1: top1+=1 s1[top1]=s2[top2] top2-=1print (s1[top1])执行程序后的输出结果是( )A.1 B.5 C.6 D.912.有如下 Python 程序段:import randomlst=['A','B','C','D']st=[0] * len(lst)i,top=0,-1while i k=random.randint(0,1) if k==0: top+=1 st[top]=lst[i] i+=1 elif top!=-1: lst[i]=st[top] top-=1执行该程序段后,lst 的值不可能是( )A.['A','B','C','D'] B.['A','B','A','C']C.['A','A','C','D'] D.['A','A','C','A']13.有如下 Python 程序段:a={'<':0,'(':1,'[':2,'{':3,'>':4,')':5,']':6,'}':7}s1=input()s=[8,0,0,0,0,0,0,0,0]top=0;flag=Truefor x in s1: k=a[x] if k<4:if s[top] flag=False breaktop+=1s[top]=kelse:if s[top]!=k-4: flag=False breaktop-=1if flag and top==0: print(″YES″)else: print(″NO″)若输出结果为“NO”,则 s1 输入的值是( )A.{}[]()<> B.[()]{<>} C.{[<()>]} D.{()[<>]}14.有如下Python程序段:import randoms=″Happy″stk=[″″]*len(s);top=-1i=0;res=″″while i if random.randint(0,1)==0 or top==-1: top+=1;stk[top]=s[i] elif s[i]>stk[top]: res+=stk[top];top-=1 i-=1 i+=1while top>=0: res+=stk[top];top-=1print(res)执行该程序段后,res的值不可能是( )A.″Hpapy″ B.″Happy″ C.″yppaH″ D.″Hpay″15.判断某序列b是否是入栈序列a=[1,2,3,4,5]的出栈序列,程序如下:a=[1,2,3,4,5]b=list(map(int,input().split()))stack=[]i=j=0while i stack.append(①____________) i+=1 while len(stack)>0 and ②____________: stack.pop() j+=1if len(stack)==0 and j==len(a): print(b,'是',a,'的出栈序列')else: print(b,'不是',a,'的出栈序列')划线处应填写的语句是( )A.①a[i] ②stack[-1]==a[j]B.①a[i] ②stack[-1]==b[j]C.①b[i] ②stack[-1]==b[i]D.①b[i] ②stack[-1]==a[j]16.自从学习了不同进制之后,小明设计了一个计算不同进制数的加法器,并用Python编程实现。输入一个加法算式,加数可以是十进制数、二进制数或者十六进制数,程序的功能是输出它们的和。例如输入形如“1010B+1DH+109D=”的加法算式后,执行程序输出“和是148”的结果。Python程序如下:s=input('输入一个混合进制的加法算式:')dic={'B':2,'D':10,'H':16}st=[″]*100top,i,x,m=-1,0,0,0while i if s[i]=='+' or s[i]=='=': m=①____________ top=top-1 t=0 while top!=-1: if st[top]>='A' and st[top]<='F': st[top]=ord(st[top])-ord('A')+10 else: st[top]=int(st[top]) ②____________ t=t+1 top=top-1 else: ③____________ st[top]=s[i] i=i+1print('和是',x)(1)将划线处代码补充完整。(2)若输入”101B+DH+100D”,输出的结果是________。17.某种密码设计方法如下:给定两个数组,数组元素由数字 1~9 组成,从中选出 k(k 小于等于两个数组长度之和)个数字拼接成一个新的数,同一数组中取出的数字保持其在原数组中的相对顺序,每个数组中至少有 1 个数被选中,满足该条件的最大数即为密码,程序运行界面如图所示。请输入数组1:3 4 6 5 7 8 请输入数组2:9 1 2 5 8 3 4 请输入k:6 密码为:987834请回答下列问题:(1)程序部分代码如下,请在划线处填入正确的代码。def select_num(nums,k): stack=[0]*len(nums);top=-1;cnt=len(nums)-k for num in nums: while cnt>0 and top!=-1 and stack[top] top-=1;cnt-=1 top+=1 ①____________ while cnt>0: top-=1;cnt-=1 return stack[0:top+1]def merge(a,b): c=″;i=0;j=0 while :if j==len(b) or i=b[j]: c+=str(a[i]);i+=1elif i==len(a) or j c+=str(b[j]);j+=1 return int(c)num1=input(″请输入数组 1:″)num2=input(″请输入数组 2:″)num1=list(map(int,num1.split(″ ″)))num2=list(map(int,num2.split(″ ″)))k=int(input(″请输入 k:″))②____________for i in range(1,k): a=select_num(num1,i) ③____________ c=merge(a,b) if c>m:m=cprint(″密码为:″+str(m))(2)加框处的程序代码有误,请改正。课时3 栈1.B [A选项和C选项都出现了 a 在 b 前面出栈的情况,因此选项错误;D选项f 出栈时栈内的元素为(栈底)c,d(栈顶),因此不可能 c 出栈,选项错误。]2.A [队列特征为先进先出,有4次出队,因此队列中3,15,8,7全部出队。Q出栈入队,因此6先入队,15和3在栈中,接着15入队,8出队入栈,因此后面是8和3。]3.D [十进制数n(0≤n<64)转换为二进制数,得到最大的是6位二进制数。]4.D [2是第1个入栈,当2出栈时,栈为空,只有9入栈再出栈。]5. A [第1个循环让abc依次入队。当队列和栈不为空时,如果栈顶元素和队首元素相同,则进行出队和出栈操作,否则将栈顶元素出栈并入队。栈顶和队首均为″a″,出队和出栈操作,接着″d″入队,″d″出栈,接着″c″入队,″c″出栈,队列中元素为″bcdc″,接着″b″出队和出栈。]6.D [入栈必先移动top指针,入栈元素为x,先对x进行除2的余数赋值。]7.A [遍历字符串s,将每个字母转换成0~25之间对应的数字。t列表是每个字母出现在栈中位置的桶。若字母不在栈中,将该字母入栈,同时记录该字母为当前栈顶位置。若该字母已经存在于栈中,将后入栈的字母进行出栈操作,并在桶中作-1的标记。最后一个h让前面所有字母出栈,因此栈中只有o和n。]8.B [本题考查栈的应用。当栈空入栈,因此3肯定在栈中。当op为0且s[i]>st[top]时,s[i]入栈,若产生op的值一直为1,则栈中只有3;入栈的元素比栈中元素大,2小于3,因此2不可能入栈,若7没有入栈,则6可能入栈。]9.D [本题考查栈的基本操作。n值为len(exp)∥2,如果是″(″,进行入栈操作,如果栈顶指针为n,若再入栈,则左括号超出总字符串长度的一半,说明左括号的数量大于右括号。否则进行出栈操作,一个右括号匹配一个左括号,若在出栈前,栈为空,说明左括号少了。遍历完后,用右括号对左括号进行出栈操作,如果栈为空,说明两者数量相等。]10.A [C要出栈,栈中有A和B,E最后一个出栈,因此E最后入栈并马上出栈,那么D可能在A前面,AB之间和B之后三个位置出栈。]11.D [本题考查栈的相关知识。若 a[i]12.B [当k的值为0时,进行入栈操作;当k的值为1且栈不为空,进行出栈并替换lst[i]操作。由于i+=1操作发生在入栈过程中,因此必须要有4个元素出栈,但栈中可能有元素未出栈。A选项当随机数4次均为0,全部元素均在栈中。C选项随机数依次为0,1,0,0,有两个元素在栈中。D选项随机数依次为0,1,0,1,A先入栈,出栈后替换B,原B位置上的A再次入栈,最后替换D。B选项当i的值为2时,AB在栈中,应该B先出栈。]13.C [本题考查栈的操作。遍历字符串s1并取出在字典中的值k,如果是符号的左半部分,并且栈顶元素大于等于k,将k值入栈。若k大于等于4,且栈顶元素等于k-4,出栈一个元素。当flag为True且栈中只剩下一个元素,输出YES,否则输出NO。A选项{在字典中键值为3,入栈,}在字典中键值为7,满足条件栈顶元素等于k-4,让栈顶元素出栈,其他符号均成对,相同方法处理。B选项[和(对应的键值分别为2和1,2入栈后,1小于栈顶2,1也入栈,接着)和]让1和2依次出栈。{键值大于<键值,相同方法处理。C选项<和(对应的键值分别为0和1,当遍历到(时s[top]14.A [分为产生随机数为0、随机数为1且s[i]>stk[top]和随机数为1且s[i]<=stk[top]三种情况,在第2种情况中,让较小的元素先出栈,同时i减1。第3种情况既不入栈,也不出栈,因此s中可能有部分元素未入栈。B选项H入栈,a让H先出栈,a入栈,p让a入栈,p和p均入栈,y分两种让两个p出栈,最后在while结构中y出栈。C选项产生的随机数均为0。D选项a让H出栈,a入栈,随机数为0,p入栈,第2个p随机数为1,不入栈。y让p和a出栈。A选项a不可能让p出栈。]15.B [本题考查栈的操作与程序实现。由第6行的添加操作和第9行的删除操作可以判断stack用于存储栈元素。可以通过将a元素不断入栈,看能否形成和b一样的出栈序列。第①空应该让a中的元素入栈,填写a[i]。而出栈时,需要判定栈顶元素是否和b序列中当前元素是否一致,一致才能出栈,尽可能形成与b一样的序列。]16.(1)①dic[st[top]] ②x=x+st[top]*m**t ③ top=top+1 (2)118解析 程序可知st列表中保存着当前加数的每一位。如对于式子“1010B+1DH+109D=”,当读到第一个加号时,st列表的值为[‘1’,‘0’,’1’,’0’,’B’],读到第二加号时,st的值是[‘1’,‘D’,‘H’],读到最后’=’号时,st的值是[‘1’,‘0’,‘9’,‘D’]。①st列表的最后一位是进制编号,读取st最后一位,通过字典dic得到进制值。②使用权值法把st列表中保存的进制数转化为十进制数。③读取到加数的每一位数字,都保存在st列表中的相应位置。(2)由于式子中的最后一位不是’+’或者’=’, 所以st列表中的最后一个数字没有加上。17.(1)①stack[top]=num ②m=0 ③b=select_num(num2,k-i) (2)i解析 本题考查栈和数据的归并。(1)①函数select_num的功能是在数字串nums取出的数字位置不变的k个长度子串。cnt初值为len(nums)-k,即需要去除的数字个数,遍历数字串nums并将数字入栈,若当前的数字比栈顶数字大,则需将栈中数字出栈,让栈中形成一个递减的系列,每出栈一个cnt减1,当cnt值为0时,则不再出栈。②对m赋初值0。③主程序外循环i的值从1循环到k,采用枚举的思想,分别从一个数组num1中选出1到k-1个数字,则从另一个数组2中选出k-1到1个数字,所以第③空应填入b=select_num(num2,k-i)。(2)自定义函数merge(a,b)用于将a、b两个数组的值合并按顺序合并成最大数,变量 i、j分别指向ab两个数组中待合并区间的初始位置,根据if j==len(b) or i=b[j]可知当只剩下a列表中的数据未处理或者a数组的值大于b数组的值则c+=a[i],否则当 i==len(a) or j 展开更多...... 收起↑ 资源列表 第三章 课时1 字符串.docx 第三章 课时2 队列.docx 第三章 课时3 栈.docx