深耕专业教研,探索前沿技术
信息技术来源:宁波“十校”2026届高三3月联考技术试题卷

第 11 题

答案与解析

本题解析

参考答案

D

程序分析

st1=[""]*len(s);top1=-1;st2=[""]*len(s);top2=-1
i=0
while i<len(s):
    ...
    i=i+1

程序为 st1、st2 各分配 len(s) 个存储位置,top1、top2 初值均为 -1。外层循环用 i 从左到右逐个处理 s 中的字符,每轮先处理已有元素,再放入当前字符 s[i]。

f=1
while top1!=-1 and s[i]<st1[top1]:
    f+=1
    if f%2==1:
        top2+=1
        st2[top2]=st1[top1]
    top1-=1

每轮从 f=1 开始,只要 st1 非空且当前字符小于 st1[top1],就处理该位置的元素,随后将 top1 减 1,使它退出有效范围。这是从栈顶弹出元素,top1 表示栈 st1 的栈顶下标,-1 表示空栈。

第 1、2、3、4……个弹出元素对应的 f 值为 2、3、4、5……。只有 f 为奇数时,才先把该元素放到 st2 的下一个位置,即压入辅助栈 st2。因此弹出次序为奇数的元素被丢弃,次序为偶数的元素暂存到 st2。

top1+=1;st1[top1]=s[i]
while top2!=-1:
    top1+=1;st1[top1]=st2[top2]
    top2-=1

先把当前字符压入 st1,再将 st2 的栈顶元素逐个弹出并压回 st1。暂存元素经过两次栈操作恢复原有的相对次序,st2 最后重新变为空栈。st1 的有效内容只到 top1,后面的旧值不属于当前栈。

字符大小关系为 a<b<c<d。读入开头的 a、连续 n 个 c 和后面的 d 时,都不会满足“当前字符小于栈顶字符”,所以这些字符依次入栈。此时 st1 从栈底到栈顶为 a、n 个 c、d。

读入最后的 b 时,先弹出 d,它是第 1 个弹出元素,f=2,被丢弃。随后从栈顶依次弹出各个 c:第 1 个 c 对应 f=3,被保留;第 2 个 c 对应 f=4,被丢弃;第 3 个 c 对应 f=5,被保留,依此类推。遇到 a 时,因为 b<a 不成立,停止弹出。

因此,n 个 c 中按弹出次序编号为 1、3、5……的被保留。n 为偶数时保留 n/2 个,n 为奇数时保留 (n+1)/2 个,统一写为 (n+1)//2。它们在 b 入栈后全部压回 st1,故 st1[:top1+1] 中 c 的个数为 (n+1)//2。