苏州工业园区苏雅璐308号信投大厦18楼-22楼 17717624695 jiuyouapp@www.j9.com

资讯中心

先入先出与后入先出的取出顺序:十八步队列与栈的取出记录·练习15

2026-11-01

同样一串放入和取出操作,排队式容器与叠放式容器会得到不同的取出顺序。比较逐步记录,比只看最后剩了几个项目更容易发现使用了哪种规则。

本篇使用一组可以手算或逐行复查的虚构游戏记录。先读清操作顺序与边界,再看完整过程;它不是某一款现有游戏的隐藏公式,也不要求读者安装工具。

规则与输入

放入的项目编号互不重复。两种容器都把新项目放到序列末端;先入先出从最早端取,后入先出从最近端取。每次取一个,空容器返回空状态而不产生虚构项目,记录全部操作后的内容。

操作序列[['take'], ['put', 1], ['take'], ['take'], ['take'], ['put', 2], ['take'], ['put', 3], ['put', 4], ['put', 5], ['put', 6], ['take'], ['put', 7], ['put', 8], ['take'], ['take'], ['put', 9], ['take']]

逐步计算与结果

操作['take']:队列取出None、栈取出None,当前队列从最早到最近为[],栈从底到顶为[]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 1]:队列取出None、栈取出None,当前队列从最早到最近为[1],栈从底到顶为[1]。空状态记作None,放入步骤的取出栏也为空。

操作['take']:队列取出1、栈取出1,当前队列从最早到最近为[],栈从底到顶为[]。空状态记作None,放入步骤的取出栏也为空。

操作['take']:队列取出None、栈取出None,当前队列从最早到最近为[],栈从底到顶为[]。空状态记作None,放入步骤的取出栏也为空。

操作['take']:队列取出None、栈取出None,当前队列从最早到最近为[],栈从底到顶为[]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 2]:队列取出None、栈取出None,当前队列从最早到最近为[2],栈从底到顶为[2]。空状态记作None,放入步骤的取出栏也为空。

操作['take']:队列取出2、栈取出2,当前队列从最早到最近为[],栈从底到顶为[]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 3]:队列取出None、栈取出None,当前队列从最早到最近为[3],栈从底到顶为[3]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 4]:队列取出None、栈取出None,当前队列从最早到最近为[3, 4],栈从底到顶为[3, 4]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 5]:队列取出None、栈取出None,当前队列从最早到最近为[3, 4, 5],栈从底到顶为[3, 4, 5]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 6]:队列取出None、栈取出None,当前队列从最早到最近为[3, 4, 5, 6],栈从底到顶为[3, 4, 5, 6]。空状态记作None,放入步骤的取出栏也为空。

操作['take']:队列取出3、栈取出6,当前队列从最早到最近为[4, 5, 6],栈从底到顶为[3, 4, 5]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 7]:队列取出None、栈取出None,当前队列从最早到最近为[4, 5, 6, 7],栈从底到顶为[3, 4, 5, 7]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 8]:队列取出None、栈取出None,当前队列从最早到最近为[4, 5, 6, 7, 8],栈从底到顶为[3, 4, 5, 7, 8]。空状态记作None,放入步骤的取出栏也为空。

操作['take']:队列取出4、栈取出8,当前队列从最早到最近为[5, 6, 7, 8],栈从底到顶为[3, 4, 5, 7]。空状态记作None,放入步骤的取出栏也为空。

操作['take']:队列取出5、栈取出7,当前队列从最早到最近为[6, 7, 8],栈从底到顶为[3, 4, 5]。空状态记作None,放入步骤的取出栏也为空。

操作['put', 9]:队列取出None、栈取出None,当前队列从最早到最近为[6, 7, 8, 9],栈从底到顶为[3, 4, 5, 9]。空状态记作None,放入步骤的取出栏也为空。

操作['take']:队列取出6、栈取出9,当前队列从最早到最近为[7, 8, 9],栈从底到顶为[3, 4, 5]。空状态记作None,放入步骤的取出栏也为空。

两种容器最后都保留3项,但项目身份和顺序需要逐项核对,不能只比数量。

怎样独立复核

对两种规则分别保存尚未取出的放入记录:队列取最早仍在的编号,栈取最晚仍在的编号。任一前缀中,已取出数加当前保留数应等于已放入数,空取出不计入已取出数。

队列适合说明按到达次序排队,栈适合说明最近一步优先撤回,但实际任务仍可能需要优先级或取消机制。本例只有最基本的容器规则,没有容量限制或多线程,不能把更多功能自动归入其中。

练习时可以只改变一个输入,再预测哪一步会最先改变。保留中间记录,检查空状态、相等数值和刚好落在边界的情况。最终结果碰巧相同,并不能证明两个过程等价;反过来,采用不同规则得出不同结果,也不应立即视作程序故障。