资源简介 4.3 栈学习目标 1.画出栈的示意图,理解入栈和出栈的操作。2.通过出栈顺序,推算入栈顺序,理解栈的后进先出的基本特性。3.根据栈的性质,实现栈的算法实现。 (2024年6月浙江选考)栈初始为空,经过一系列入栈、出栈操作后,栈又为空。若元素入栈的顺序为“生”“旦”“净”“末”“丑”,则所有可能的出栈序列中,以“旦”结尾的序列个数为( )A.3 B.4C.5 D.6 栈主要用于计算过程中保存的临时数据,是一种只能在数组一端进行存取的数据结构,最大特点是数据在存取时,无需查询,时间复杂度为O(1),后存的数据先被取出。栈中元素必须满足先进后出原则。由于栈顶指针top指向栈中最后一个元素的索引位置,因此栈中元素的个数为top+1,出栈时往往先要读取栈顶元素,再向下移动指针,入栈时,需先向上移动指针,再存入数据。例1 有后缀表达式“1 3+2*3+2 *”,现利用栈计算该表达式:从左向右扫描,遇到数字时,数字入栈;遇到运算符时,两个元素出栈,用运算符计算,所得结果入栈,如此反复操作,直到扫描结束,栈顶元素是( )A.21 B.22C.23 D.24变式1 有后缀表达式“346*+52*+”,现利用栈计算该表达式:从左向右扫描,遇到数字时,数字入栈;遇到运算符时,两个元素出栈,用运算符计算,所得结果入栈,如此反复操作,直到扫描结束,栈的深度至少是( )A.2 B.3C.4 D.5例2 有如下Python程序段:import randoma=['A','B','#','#','C','D','#']stk=[0]*len(a);top=-1for i in range(len(a)): op=random.randint(0,1) #随机生成0或1 if op==1 and a[i]!='#': top+=1;stk[top]=a[i] a[i]='#' elif op==0 and top!=-1 and a[i]=='#': a[i]=stk[top];top-=1执行该程序段后,a的值不可能的是( )A.['A','B','#','#','C','D','#']B.['#','#','#','#','#','#','#']C.['#','B','#','#','C','D','A']D.['#','#','A','B','C','D','#']变式2 列表c长度为100,如图所示,其中c[10]~c[89]各元素的值均为1-99的随机正整数。执行如下程序段,输出的最后一行是( )i 0 1 2 3 4 5 6 7 8 9 … 90 91 92 93 94 95 96 97 98 99c[i] 4 10 15 8 12 13 15 7 5 10 … 4 55 1 12 39 15 40 21 25 18top=-1for i in range(len(c)): t=0 while top>=0 and c[top]>=c[i]: t+=1 top-=1 top+=1 c[top]=c[i] print(top,t)A.5 4 B.3 2 C.4 3 D.2 31.元素30,97,32,75,99入栈的顺序为30,97,32,75,99,如果最先出栈的是32,那么最后出栈的不可能的是( )A.30 B.97C.75 D.992.栈S最大长度为3,若元素a,b,c,d依次入栈,则可能的出栈序列为( )A.d,c,b,a B.b,a,d,cC.c,a,b,d D.c,d,a,b3.有一个空栈,若元素入栈的顺序是a,b,c,d,e,第1个出栈的元素是d,则当所有元素都出栈后,下列说法正确的是( )A.c一定比a,b先出栈B.最后一个出栈的元素一定是eC.最后一个出栈的元素一定是aD.a,b,c出栈的先后顺序不确定4.已知栈st中从栈底到栈顶的元素依次为a、b、c,元素 d 正等待入栈,以下出栈序列不可能的是( )A.c,b,d,a B.c,d,a,bC.c,d,b,a D.c,b,a,d5.有1个栈初始为空,其元素入栈顺序依次为s,t,r,w,u,y,m,若经过入栈和出栈操作后,栈底至栈顶元素分别为t,w,y,则第3个出栈元素为( )A.m B.wC.u D.s6.栈初始为空,经过一系列的入栈、出栈操作后,栈为空,若元素入栈顺序为ABCD,则所有可能的出栈序列中,C比A先出栈的个数为( )A.5 B.6C.7 D.87.栈S从栈底到栈顶的元素依次为5,8,3,9,7,队列Q初始为空。约定:栈中元素依次出栈后入队,当队尾元素小于队首元素时,队列元素会出队后入栈,直到队尾元素不小于队首元素。当栈为空时,队列中队首到队尾的元素依次为( )A.3,7,9,8,5 B.3,9,7,8,5C.5,9,7,8,3 D.5,7,9,8,38.有一个队列和一个栈,其中队列中队首到队尾的元素依次为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,79.有如下程序段:s=["A","B","C","D","E"]m=[1,3,2,1,2]st=[""]*4;top=-1j=0for i in range(len(s)): top+=1 st[top]=s[i] while top!=-1 and ord(st[top])-ord("A")==m[j]: top-=1 j+=1print(st[:top+1])执行该程序段后,输出内容是( )A.[]B.['A','C']C.['A','E']D.['A','C','E']10.有如下Python程序段:s=input("请输入:")stack=[""]*10;top=-1for i in range(len(s)): if top==-1 or stack[top]!=s[i]: top+=1 stack[top]=s[i] else: top-=1print(top+1)执行该程序段后,输入变量s的值,程序的输出结果与其他选项不同的是( )A."aabbc" B."aaabbac"C."bbcaa" D."aabcb"11.有如下Python程序段:stk=[5,2,6,3,7];q,s=0,0lst=[0]*10;top=len(stk)-1while top>-1: s+=stk[top] if s % a==0: break else: lst[q]=stk[top] q+=1 top-=1for i in range (q): top+=1;stk[top]=lst[i]若a为[2,4]区间的随机整数,执行该程序段后,stk的值不可能是( )A.[5,2,6,7,3] B.[5,2,6,3,7]C.[5,2,7,6,3] D.[5,2,7,3,6]12.有如下Python程序段:import randomp="abcde*";s=""st=[""]*1000;top=-1i=0while i<=5: m=random.randint(0,1) if m==0: top+=1 st[top]=p[i] i+=1 elif len(st)>0: s+=st[top] top-=1print(s)执行上述程序段后,输出结果可能的是( )A.a* B.cdabeC.abcde* D.cdba13.给定长度为n的数组ts,需为每个元素ts[i]在其后寻找首个更大元素ts[j]。若找到,将两者位置距离存入ans[i],否则ans[i]的值为0。例如数组ts为[33,34,35,31,29,32,36,33],则数组ans为[1,1,4,2,1,1,0,0]。实现该功能的程序段如下,方框处应填入的代码是( )ans=[0]*n;s=[0]*ntop=-1for i in range(n): t=ts[i] while top>=0 and t>ts[s[top]]: j=s[top] top-=1 top+=1 s[top]=iA.ans[i]=j-i B.ans[i]+=1C.ans[j]=i-j D.ans[i-j]+=11.有五个元素的出栈顺序依次为1,2,3,4,5。则这五个元素的入栈顺序可能是( )A.1,4,5,3,2 B.2,4,3,1,5C.3,5,4,1,2 D.5,4,1,3,22.元素A,B,C,D,E,F按序入栈,在所有出栈序列中(元素需全部出栈),以元素E开头且以元素A结尾的出栈序列的数量有( )A.3 B.4C.5 D.63.已知某栈结构初始状态为空,将“岸南江春绿风又”中各个汉字依次入栈,若要求出栈次序为“春风又绿江南岸”,则栈的容量至少为( )A.6 B.5C.4 D.34.栈初始为空,经过一系列入栈、出栈操作后,栈又为空。若元素入栈顺序为“红”、“橙”、“黄”、“绿”、“蓝”,在所有可能的出栈序列中,“红”比“蓝”晚三步出栈的序列个数是(若出栈顺序为“蓝红某某某”,则表示“红”比“蓝”出栈晚一步)( )A.3 B.4C.5 D.65.S从栈底到栈顶元素依次为1,2,4,5,现有新元素3。经过如下操作:若栈非空且新元素小于或等于栈顶元素,栈顶元素出栈,直到栈空或新元素大于栈顶元素,再将新元素入栈。则S中剩余元素个数为( )A.1 B.2C.3 D.46.利用栈求逆波兰表达式(表达式由操作数和运算符组成)的方法是:从左往右扫描该表达式,遇到操作数时入栈;遇到运算符时,把处于栈上方的两个元素依次出栈,用运算符计算,并把计算结果压入栈中。如此反复操作,直至表达式扫描结束。当用该算法求逆波兰表达式abcd-*e/+f-的值时(abcdef表示不同的操作数),所使用栈的深度至少为( )A.3 B.4C.5 D.67.栈S从栈底到栈顶的元素依次为2、4,队列Q从队首到队尾的元素依次为1、3。约定:A操作是取出栈顶元素x和队首元素y,将x和y相加后入队;M操作是取出栈顶元素x和队首元素y,将x和y相乘后入栈。则经过MAM系列操作后,栈顶元素为( )A.14 B.20C.26 D.288.栈S从栈底到栈顶的元素依次为1,2,3,队列Q初始为空。约定:U操作是指元素出栈后入队,H操作是指元素出队后再入队。经过UUHU系列操作后,队列中队首到队尾的元素依次为( )A.2,1,3 B.3,1,2C.1,3,2 D.2,3,19.有如下Python程序段:st=[0]*10a=[4,6,1,7,2,8,6]top=0;st[top]=a[0]for i in range(1,len(a)): while top!=-1 and a[i] top-=1 top+=1 st[top]=a[i]执行该程序段后,变量top的值为( )A.-1 B.1C.2 D.310.已知字符“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']11.有如下Python程序段:s=[0]*10;q=[0]*10a=[6,3,2,4,2,1,5]n,top,head,tail=len(a),0,0,0s[top]=a[0]for i in range(1,n): while top!=-1 and a[i]>s[top]: q[tail]=s[top];tail+=1 top-=1 top+=1;s[top]=a[i]while head!=tail: print(q[head],end=' ') head+=1程序段运行后,输出第3个数字为( )A.1 B.2C.3 D.412.有如下Python程序:stackA=[0]*6stackB=[0]*6topA=topB=-1d=[5,9,4,8,7,2]for i in range(len(d)): while topA!=-1 and d[i] topB+=1 stackB[topB]=stackA[topA] topA-=1 topA+=1;stackA[topA]=d[i]程序执行过程中,变量topB的最大值为( )A.2 B.3C.4 D.513.有如下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']14.有如下Python程序段:a=[2,1,5,7,3];n=len(a)s1=[-1]*n;top1=-1s2=[-1]*n;top2=-1for i in range(n): 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-=1运行该程序段后,下列表达式不成立的是( )A.top1==5 B.top2==-1C.s1[0]==1 D.s1[3]==715.将列表a中的n个整型元素按一定规则压入栈stack中,现要求在出栈时可以获得原压入栈的值以及仍在栈中的最小值。实现该功能的程序段如下,方框处应填入的代码是( )stack=[0]*len(a);top=-1;min=0for x in a: if top==-1: min=x top+=1 stack[top]=x-min if x min=xwhile top!=-1: print("当前栈中最小元素为:",min) x=stack[top] top-=1 print("当前出栈元素为:",v)A.if x>0: v=min min-=xelse: v=x+minB.if x<0: v=x+minelse: v=min min-=xC.if x>0: v=x+min min-=xelse: v=minD.if x>0: v=x+minelse: v=min min-=x16.有如下Python程序段:from random import randintst=[""]*4;ys="ABCD";cz=[1,1,1,1]x=randint(0,3) #随机生成0、1、2、3cz[x]=0top=-1;pos=0for i in range(len(cz)): if cz[i]==0 and top>-1: top=top-1 elif cz[i]==1: top=top+1;st[top]=ys[pos] pos=pos+1print(st[:top+1])执行该程序段后,输出结果不可能的是( )A.['A','B']B.['B','D']C.['B','C']D.['A','B','C']4.3 栈学习目标 1.画出栈的示意图,理解入栈和出栈的操作。2.通过出栈顺序,推算入栈顺序,理解栈的后进先出的基本特性。3.根据栈的性质,实现栈的算法实现。 (2024年6月浙江选考)栈初始为空,经过一系列入栈、出栈操作后,栈又为空。若元素入栈的顺序为“生”“旦”“净”“末”“丑”,则所有可能的出栈序列中,以“旦”结尾的序列个数为( )A.3 B.4C.5 D.6答案 C解析 本题考查栈的性质。“旦”要结尾,“生”必定是入栈后马上出栈。剩下“净末丑”3个元素按先进后出的顺序进行组合,“净”先出栈,有“净末丑、净丑末”2种组合。“末”先出栈,有“末净丑、末丑净”2种组合。“丑”先出栈,“净末”在栈中,只有“丑末净”一种组合,因此共有5种组合。 栈主要用于计算过程中保存的临时数据,是一种只能在数组一端进行存取的数据结构,最大特点是数据在存取时,无需查询,时间复杂度为O(1),后存的数据先被取出。栈中元素必须满足先进后出原则。由于栈顶指针top指向栈中最后一个元素的索引位置,因此栈中元素的个数为top+1,出栈时往往先要读取栈顶元素,再向下移动指针,入栈时,需先向上移动指针,再存入数据。例1 有后缀表达式“1 3+2*3+2 *”,现利用栈计算该表达式:从左向右扫描,遇到数字时,数字入栈;遇到运算符时,两个元素出栈,用运算符计算,所得结果入栈,如此反复操作,直到扫描结束,栈顶元素是( )A.21 B.22C.23 D.24思维点拨明考向 本题考查栈和后缀表达式应用精点拨 将后缀表达式“1 3+2*3+2 *”转换为中缀表达式后为“((1+3)*2+3)*2”,计算结果为22答案 B变式1 有后缀表达式“346*+52*+”,现利用栈计算该表达式:从左向右扫描,遇到数字时,数字入栈;遇到运算符时,两个元素出栈,用运算符计算,所得结果入栈,如此反复操作,直到扫描结束,栈的深度至少是( )A.2 B.3C.4 D.5答案 B解析 元素346入栈,长度至少为3,4和6出栈,24入栈,遇+号,栈中只有元素27,元素5和2入栈,因此栈深度至少是3。例2 有如下Python程序段:import randoma=['A','B','#','#','C','D','#']stk=[0]*len(a);top=-1for i in range(len(a)): op=random.randint(0,1) #随机生成0或1 if op==1 and a[i]!='#': top+=1;stk[top]=a[i] a[i]='#' elif op==0 and top!=-1 and a[i]=='#': a[i]=stk[top];top-=1执行该程序段后,a的值不可能的是( )A.['A','B','#','#','C','D','#']B.['#','#','#','#','#','#','#']C.['#','B','#','#','C','D','A']D.['#','#','A','B','C','D','#']思维点拨明考向 本题考查栈的应用。若op=1,且'#'时要入栈,是字母时,if语句与elif语句都不执行。若op=0,栈不空且a[i]值为'#',把栈顶值代替当前元素,且进行出栈操作精点拨 A 当op的值每次都是0时即可实现B 当op的值每次都是1时即可实现C 当op的值依次是1、0、1、1、0、0、0时即可实现D a[0]、a[1]值是'#',表明A、B均已入栈,选项不符合出栈顺序答案 D变式2 列表c长度为100,如图所示,其中c[10]~c[89]各元素的值均为1-99的随机正整数。执行如下程序段,输出的最后一行是( )i 0 1 2 3 4 5 6 7 8 9 … 90 91 92 93 94 95 96 97 98 99c[i] 4 10 15 8 12 13 15 7 5 10 … 4 55 1 12 39 15 40 21 25 18top=-1for i in range(len(c)): t=0 while top>=0 and c[top]>=c[i]: t+=1 top-=1 top+=1 c[top]=c[i] print(top,t)A.5 4 B.3 2 C.4 3 D.2 3答案 B解析 遍历列表c,每次弹出栈中所有大于等于当前元素的元素,并记录弹出次数t。当变量i遍历92时,c[i]的值均小于等于栈中的值,元素1入栈,因此程序实现的将一段从小到大的元素依次入栈,直到下一个比栈底元素还小的元素为止。当i的值为98时,栈中元素依次为1,12,15,21,25,元素18让21和25出栈,最后剩下4个元素,top的值为3。1.元素30,97,32,75,99入栈的顺序为30,97,32,75,99,如果最先出栈的是32,那么最后出栈的不可能的是( )A.30 B.97C.75 D.99答案 B解析 元素32已出栈,则30,97必定在栈中,因此97肯定比30先出栈。2.栈S最大长度为3,若元素a,b,c,d依次入栈,则可能的出栈序列为( )A.d,c,b,a B.b,a,d,cC.c,a,b,d D.c,d,a,b答案 B解析 A选项d要入栈,至少需要4个长度。B选项a,b入栈,b,a出栈。c,d入栈,d,c出栈。C和D选项a,b入栈,则b先于a出栈。3.有一个空栈,若元素入栈的顺序是a,b,c,d,e,第1个出栈的元素是d,则当所有元素都出栈后,下列说法正确的是( )A.c一定比a,b先出栈B.最后一个出栈的元素一定是eC.最后一个出栈的元素一定是aD.a,b,c出栈的先后顺序不确定答案 A解析 d出栈,则栈中有元素a,b,c。因此c一定比a,b先出栈,且a,b,c出栈的先后顺序是确定的。e可能是第2个出栈的,也可能是最后一个出栈的。4.已知栈st中从栈底到栈顶的元素依次为a、b、c,元素 d 正等待入栈,以下出栈序列不可能的是( )A.c,b,d,a B.c,d,a,bC.c,d,b,a D.c,b,a,d答案 B解析 栈中有元素a、b、c,则出栈的顺序必定是c、b、a。5.有1个栈初始为空,其元素入栈顺序依次为s,t,r,w,u,y,m,若经过入栈和出栈操作后,栈底至栈顶元素分别为t,w,y,则第3个出栈元素为( )A.m B.wC.u D.s答案 C解析 根据栈的特性,在栈中元素后进先出,因此第1个入栈和出栈的元素是s,第3个入栈第2个出栈的元素是r,第5个入栈第3个出栈的元素是u。6.栈初始为空,经过一系列的入栈、出栈操作后,栈为空,若元素入栈顺序为ABCD,则所有可能的出栈序列中,C比A先出栈的个数为( )A.5 B.6C.7 D.8答案 C解析 在元素ABC中,C比A先出栈有CBA或BCA两种可能。在序列CBA中,元素D可能的位置有4个,而在序列BCA中,不可能出现DBCA的序列,可能的位置只有3个。7.栈S从栈底到栈顶的元素依次为5,8,3,9,7,队列Q初始为空。约定:栈中元素依次出栈后入队,当队尾元素小于队首元素时,队列元素会出队后入栈,直到队尾元素不小于队首元素。当栈为空时,队列中队首到队尾的元素依次为( )A.3,7,9,8,5 B.3,9,7,8,5C.5,9,7,8,3 D.5,7,9,8,3答案 B解析 元素7出栈入队,队中只有一个元素。队尾元素9大于队首元素7;元素3出队入栈,让7和9依次出队并入栈,元素3是最小的,不可能再出队,因此依次出栈的顺序是9,7,8,5。8.有一个队列和一个栈,其中队列中队首到队尾的元素依次为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,7答案 A解析 队列特征为先进先出,有4次出队,因此队列中3,15,8,7全部出队。Q出栈入队,因此6先入队,15和3在栈中,接着15入队,8出队入栈,因此后面是8和3。9.有如下程序段:s=["A","B","C","D","E"]m=[1,3,2,1,2]st=[""]*4;top=-1j=0for i in range(len(s)): top+=1 st[top]=s[i] while top!=-1 and ord(st[top])-ord("A")==m[j]: top-=1 j+=1print(st[:top+1])执行该程序段后,输出内容是( )A.[]B.['A','C']C.['A','E']D.['A','C','E']答案 C解析 遍历列表s,将每个元素入栈,若当前栈顶元素与ord("A")差值为m[j],则将栈顶元素出栈处理。元素"A"和"B"入栈,"B"与ord("A")差值为m[j]为1,"B"出栈,j加1,m[j]值为3,元素"C"和"D"入栈,"D"与ord("A")差值为m[j]为3,"D"出栈;j加1,m[j]值为2,栈顶为元素为"C","C"出栈,最后"E"入栈。10.有如下Python程序段:s=input("请输入:")stack=[""]*10;top=-1for i in range(len(s)): if top==-1 or stack[top]!=s[i]: top+=1 stack[top]=s[i] else: top-=1print(top+1)执行该程序段后,输入变量s的值,程序的输出结果与其他选项不同的是( )A."aabbc" B."aaabbac"C."bbcaa" D."aabcb"答案 D解析 遍历字符串s,若栈空或当前字符s[i]不等于栈顶元素,则该元素入栈,否则栈顶元素出栈。A选项剩余元素c,B选项第1个元素a入栈后,第2个a让栈内元素a出栈,第3个元素a入栈,元素b入栈后出栈,第4个a让栈内元素a出栈,栈内只剩下元素c。同理C选项只有元素c。D选项栈内有元素bcb。11.有如下Python程序段:stk=[5,2,6,3,7];q,s=0,0lst=[0]*10;top=len(stk)-1while top>-1: s+=stk[top] if s % a==0: break else: lst[q]=stk[top] q+=1 top-=1for i in range (q): top+=1;stk[top]=lst[i]若a为[2,4]区间的随机整数,执行该程序段后,stk的值不可能是( )A.[5,2,6,7,3] B.[5,2,6,3,7]C.[5,2,7,6,3] D.[5,2,7,3,6]答案 C解析 栈中已经有5个元素,将栈顶元素值累加到s中,如果s是a的倍数,结束循环,否则将栈顶元素添加到lst中(入队),并出栈,最后把列表lst中元素返回到栈中。当a的值为2时,7和3累加值为10,栈中值为B选项。当a的值为3时,7+3+6+2=18,列表lst中依次为7,3,6,栈中值为D选项。当a的值为4时,7+3+6=16,列表lst中依次为7,3,栈中值为A选项。C选项3较6先出栈,因此3必定先出队。12.有如下Python程序段:import randomp="abcde*";s=""st=[""]*1000;top=-1i=0while i<=5: m=random.randint(0,1) if m==0: top+=1 st[top]=p[i] i+=1 elif len(st)>0: s+=st[top] top-=1print(s)执行上述程序段后,输出结果可能的是( )A.a* B.cdabeC.abcde* D.cdba答案 D解析 若产生的随机数m值为0,进行入栈操作。否则出栈后并连接到字符串s中。则于最后一个字符*一旦入栈后,i的值为5,结束循环,就不可能出栈。B选项a比b先入栈,出栈顺序应相反。D选项abc先入栈,c出栈,d入栈后出栈,最后a出栈。13.给定长度为n的数组ts,需为每个元素ts[i]在其后寻找首个更大元素ts[j]。若找到,将两者位置距离存入ans[i],否则ans[i]的值为0。例如数组ts为[33,34,35,31,29,32,36,33],则数组ans为[1,1,4,2,1,1,0,0]。实现该功能的程序段如下,方框处应填入的代码是( )ans=[0]*n;s=[0]*ntop=-1for i in range(n): t=ts[i] while top>=0 and t>ts[s[top]]: j=s[top] top-=1 top+=1 s[top]=iA.ans[i]=j-i B.ans[i]+=1C.ans[j]=i-j D.ans[i-j]+=1答案 C解析 栈初始为空,将数组ts第1个元素的下标0入栈。后续遍历ts的过程中,若栈不为空,且当前元素值ts[i]大于栈顶元素,则将栈顶元素依次出栈。即栈中元素从栈顶到栈底必须是升序的。元素34让33出栈可以计算得出ans[0]的值为1。当元素35入栈后,元素31、29依次入栈,元素32让29和31出栈,计算出相应ans[4],ans[3]中的值依次为1和2,因此可以得知,当栈顶元素值j出栈时,可以计算ans[j]的值为i-j。1.有五个元素的出栈顺序依次为1,2,3,4,5。则这五个元素的入栈顺序可能是( )A.1,4,5,3,2 B.2,4,3,1,5C.3,5,4,1,2 D.5,4,1,3,2答案 D解析 A选项4比5先入栈,则5应先出栈。B选项1要出栈,栈中有元素2,4,3,则4必须先于3出栈。C选项1要出栈,栈中有元素3,5,4,则4必须先于3出栈。D选项5,4,1入栈,接着1出栈,3和2入栈,再依次出栈。2.元素A,B,C,D,E,F按序入栈,在所有出栈序列中(元素需全部出栈),以元素E开头且以元素A结尾的出栈序列的数量有( )A.3 B.4C.5 D.6答案 B解析 E出栈时,栈内有元素A、B、C、D。元素A必须最后出栈,出栈序列可能为:EFDCBA、EDFCBA、EDCFBA、EDCBFA。3.已知某栈结构初始状态为空,将“岸南江春绿风又”中各个汉字依次入栈,若要求出栈次序为“春风又绿江南岸”,则栈的容量至少为( )A.6 B.5C.4 D.3答案 B解析 将“岸南江春绿风又”中各个汉字依次入栈,当风出栈时,栈中还有元素“岸南江绿”,因此栈的容量至少为5。4.栈初始为空,经过一系列入栈、出栈操作后,栈又为空。若元素入栈顺序为“红”、“橙”、“黄”、“绿”、“蓝”,在所有可能的出栈序列中,“红”比“蓝”晚三步出栈的序列个数是(若出栈顺序为“蓝红某某某”,则表示“红”比“蓝”出栈晚一步)( )A.3 B.4C.5 D.6答案 A解析 红比蓝晚三步出栈的有3种可能:①橙、蓝、绿、黄、红;②黄、蓝、绿、橙、红;③绿、蓝、黄、橙、红。5.S从栈底到栈顶元素依次为1,2,4,5,现有新元素3。经过如下操作:若栈非空且新元素小于或等于栈顶元素,栈顶元素出栈,直到栈空或新元素大于栈顶元素,再将新元素入栈。则S中剩余元素个数为( )A.1 B.2C.3 D.4答案 C解析 元素5和4小于3,由这两个元素出栈,栈中剩余元素为1,2,3。6.利用栈求逆波兰表达式(表达式由操作数和运算符组成)的方法是:从左往右扫描该表达式,遇到操作数时入栈;遇到运算符时,把处于栈上方的两个元素依次出栈,用运算符计算,并把计算结果压入栈中。如此反复操作,直至表达式扫描结束。当用该算法求逆波兰表达式abcd-*e/+f-的值时(abcdef表示不同的操作数),所使用栈的深度至少为( )A.3 B.4C.5 D.6答案 B解析 abcd依次入栈,栈深度为4,遇到“-”,进行c-d操作后,计算结果重新入栈(栈深度为3),遇到“*”,进行b*(c-d)操作后重新入栈(深度为2),接着“e”入栈(栈深度为3)最大深度为4。7.栈S从栈底到栈顶的元素依次为2、4,队列Q从队首到队尾的元素依次为1、3。约定:A操作是取出栈顶元素x和队首元素y,将x和y相加后入队;M操作是取出栈顶元素x和队首元素y,将x和y相乘后入栈。则经过MAM系列操作后,栈顶元素为( )A.14 B.20C.26 D.28答案 A解析 x的值为4,y的值为1,x*y值为4,重新入栈;再进行 A操作,x值4,y值3,x+y值为7,重新入队;最后进行 M操作,x的值为2,y的值为7,x*y值为14重新入栈,故栈顶元素是14。8.栈S从栈底到栈顶的元素依次为1,2,3,队列Q初始为空。约定:U操作是指元素出栈后入队,H操作是指元素出队后再入队。经过UUHU系列操作后,队列中队首到队尾的元素依次为( )A.2,1,3 B.3,1,2C.1,3,2 D.2,3,1答案 D解析 本题考查栈的基本性质。两次出栈后入队,队列的结果为3,2。队首元素出队后再入队,队列为2,3,最后1入队。9.有如下Python程序段:st=[0]*10a=[4,6,1,7,2,8,6]top=0;st[top]=a[0]for i in range(1,len(a)): while top!=-1 and a[i] top-=1 top+=1 st[top]=a[i]执行该程序段后,变量top的值为( )A.-1 B.1C.2 D.3答案 C解析 栈中初始有一个值,从索引位置1开始遍历,当遍历到的数比栈顶小时,将栈顶元素出栈,自身入栈。遍历到1时,让4和6出栈。7入栈,2使得7出栈,8入栈,6使得8出栈,因此栈中有1、2和6共3个元素,top值为2。10.已知字符“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']答案 A解析 第1个循环让abc依次入队。当队列和栈不为空时,如果栈顶元素和队首元素相同,则进行出队和出栈操作,否则将栈顶元素出栈并入队。栈顶和队首均为"a",出队和出栈操作,接着"d"入队,"d"出栈,接着"c"入队,"c"出栈,队列中元素为"bcdc",接着"b"出队和出栈。11.有如下Python程序段:s=[0]*10;q=[0]*10a=[6,3,2,4,2,1,5]n,top,head,tail=len(a),0,0,0s[top]=a[0]for i in range(1,n): while top!=-1 and a[i]>s[top]: q[tail]=s[top];tail+=1 top-=1 top+=1;s[top]=a[i]while head!=tail: print(q[head],end=' ') head+=1程序段运行后,输出第3个数字为( )A.1 B.2C.3 D.4答案 A解析 程序首先建立两个长度为10的列表s与q,将a[0]入队。从索引位1开始向后遍历列表a,将s列表小于a[i]的值出栈,加入队列q中。输出队列q中的元素,输出23124。12.有如下Python程序:stackA=[0]*6stackB=[0]*6topA=topB=-1d=[5,9,4,8,7,2]for i in range(len(d)): while topA!=-1 and d[i] topB+=1 stackB[topB]=stackA[topA] topA-=1 topA+=1;stackA[topA]=d[i]程序执行过程中,变量topB的最大值为( )A.2 B.3C.4 D.5答案 C解析 遍历数组d,若栈stackA不空,且d[i]小于stackA[topA],则让stackA[topA]出栈并入栈stackB。5和9入栈stackA,4让5和9出栈并入栈stackB,8入栈stackA,7让8出栈并入栈stackB,2让7,4出栈并入栈stackB,栈stackB中共有5个元素,因此topB的最大值为4。13.有如下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']答案 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先出栈。14.有如下Python程序段:a=[2,1,5,7,3];n=len(a)s1=[-1]*n;top1=-1s2=[-1]*n;top2=-1for i in range(n): 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-=1运行该程序段后,下列表达式不成立的是( )A.top1==5 B.top2==-1C.s1[0]==1 D.s1[3]==7答案 A解析 本题考查栈的基本应用。遍历列表a中数据,若栈s1不空,且s1栈顶元素大于等于a[i]时,不断地将s1中元素出栈,并入栈s2中,将a[i]入栈s1。因此栈s1中元素有1,3,栈s2中有元素[2,7,5],最后将栈s2中元素出栈并加入栈s1中,因此栈s1中最终结果为[1,3,5,7,2]。15.将列表a中的n个整型元素按一定规则压入栈stack中,现要求在出栈时可以获得原压入栈的值以及仍在栈中的最小值。实现该功能的程序段如下,方框处应填入的代码是( )stack=[0]*len(a);top=-1;min=0for x in a: if top==-1: min=x top+=1 stack[top]=x-min if x min=xwhile top!=-1: print("当前栈中最小元素为:",min) x=stack[top] top-=1 print("当前出栈元素为:",v)A.if x>0: v=min min-=xelse: v=x+minB.if x<0: v=x+minelse: v=min min-=xC.if x>0: v=x+min min-=xelse: v=minD.if x>0: v=x+minelse: v=min min-=x答案 D解析 在入栈过程中,若当前数x是最小值,则将x-min入栈,因此若栈中的数为0或负数,则当前的数为最小值。在出栈过程中,若出栈的元素大于0,则真实的值应为x+min。否则出栈的是最小值,要更新当前在栈中的最小值min为min-x。以列表a为[4,3,5,1,4]为例,入栈的值依次为[0,-1,2,-2,3],栈中最小值为1,第1个出栈的元素为3+1=4。第2个出栈的元素是最小值,同时更新当前栈中最小值为1-(-2)=3。16.有如下Python程序段:from random import randintst=[""]*4;ys="ABCD";cz=[1,1,1,1]x=randint(0,3) #随机生成0、1、2、3cz[x]=0top=-1;pos=0for i in range(len(cz)): if cz[i]==0 and top>-1: top=top-1 elif cz[i]==1: top=top+1;st[top]=ys[pos] pos=pos+1print(st[:top+1])执行该程序段后,输出结果不可能的是( )A.['A','B']B.['B','D']C.['B','C']D.['A','B','C']答案 B解析 若产生x的值为0,没有出栈,入栈'A','B','C'共3个元素。产生x值为1,'A'入栈再出栈,接着入栈'B'和'C'共['B','C']2个元素。产生x值为2,'A'和'B'入栈,'B'出栈,'C'入栈,共['A','C']2个元素。产生x值为3,'A','B','C'入栈,'C'出栈,共['A','B']2个元素。 展开更多...... 收起↑ 资源列表 4.3 栈.docx 4.3 栈无答案.docx