信息技术来源: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按遍历次序保存这些结果。
选项分析
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_03_G3_mingxiaoxiezuoti_q012
