深耕专业教研,探索前沿技术
信息技术来源:2025学年第二学期浙江省名校协作体高三试题

第 12 题

答案与解析

本题解析

参考答案

D

程序分析

ans = []
s = []
p = 0
idx = -1
...
while p != -1:
    idx += 1
    ans.append(0)    #在列表ans末尾添加元素0
    ...

程序从p=0开始处理数据,直到p=-1时停止。每轮先将idx加1,使其按0、1、2、…连续编号,并在ans末尾添加0,为本轮的结果预留位置。因此,ans的下标对应处理的先后次序,而不是直接使用p作为下标。

while s != [] and s[len(s) - 1][0] < data[p][0]:
    ans[s[len(s) - 1][1]] = data[p][0]
    s.pop()      #将列表s末尾元素删除

内层循环比较s末尾记录的第0项与当前值data[p][0]。若前者严格小于后者,就把当前值写入这条记录第1项指定的ans位置,再删除末尾记录。循环继续处理新的末尾,直到s为空或末尾数值不小于当前值;数值相等时不会触发更新。

s.append([data[p][0], idx])
p = data[p][1]

当前值与其结果下标idx一起添加到s末尾。结合前面的末尾访问和pop操作,可知s作为栈使用,栈底在列表首端,栈顶在末尾;每条记录保存“数值、对应的ans下标”,等待后续更大的值来更新结果。

随后p取data[p][1],将其作为下一轮访问data的下标。这说明data按静态链表组织:每项的第0项是数据,第1项是下一结点的下标,0为首结点下标,-1表示链表结束。遍历时必须沿链接前进,不能直接按data的物理存储顺序读取数值。

整体功能

按链表遍历顺序,程序为每个数寻找其后第一个严格大于它的数;若不存在,结果保留为0。每次入栈前都会弹出栈顶所有较小的数,使栈中数值从栈底到栈顶保持非递增。遇到当前值时,被弹出的数此前一直未遇到更大的数,因此当前值就是它们各自第一个更大的后继值。ans按遍历次序保存这些结果。

选项分析

A

不符合。结点下标依次为0→4→2→3→1,数值序列为5、7、5、5、9。第二个数7之后第一个更大的数是9,所以ans[1]=9,与目标中的0不符。

B

不符合。结点下标依次为0→2→1→4→3,数值序列为7、4、3、5、2。第一个数7之后没有更大的数,所以ans[0]=0,与目标中的7不符。

C

不符合。结点下标依次为0→3→4→1→2,数值序列为4、7、7、5、4。第三个数7之后没有更大的数,所以ans[2]=0,与目标中的4不符。

D

符合。结点下标依次为0→4→1→2→3,数值序列为2、7、3、4、5。2后面第一个更大的数为7;7后面没有更大的数;3后面第一个更大的数为4;4后面第一个更大的数为5;最后的5无后继,因此ans为[7, 0, 4, 5, 0]。