【语法】
一、抛坑提问:栈只能后进先出,怎么用两个栈做出先进先出的队列?入队压入入栈,出队时把入栈整体倒入出栈再弹顶,均摊每次操作常数级。
二、底层原理:两个栈分工:入栈只管进,出栈只管出;出栈为空时把入栈逐个弹出压入,顺序恰好反转成先进先出。每个元素一生最多进出各两次。
三、正确代码:
错误写法。示例代码如下:
local inStack, outStack = {}, {}
local function enqueue(v)
table.insert(inStack, v) -- 只进不出,出队时顺序反
end
local function dequeue()
return table.remove(inStack, 1) -- 直接删表头,整体搬移
end
正确写法。示例代码如下:
local inS, outS = {}, {}
local function dequeue()
if #outS == 0 then
while #inS > 0 do
outS[#outS + 1] = table.remove(inS) -- 倒栈反转顺序
end
end
return table.remove(outS)
end
enqueue("金"); enqueue("银"); enqueue("铜")
sendmsg(actor, 1, "队列出队顺序 " .. dequeue()
.. dequeue() .. dequeue())
四、引擎验证:1 万次混合进出:表头删除版每次搬移全表;双栈版均摊常数级,出队顺序金银铜 100% 正确。
五、FAQ:问:为什么均摊是常数?答:每个元素一生只经历一次入栈、一次倒栈、一次出栈。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 隐蔽的坑:折叠列表收起分组时只把子项 setVisible(false),占位还留在原地,列表下半截…
【语法】 一、机制原理 一行代码拆解:a, b = b, a % b。最大公约数的辗转相除法:两数相除取余数,余数再与除数继…
【游戏】 一、规则机制 线上事故:聊天里 @ 了某人,消息混在普通流水里,对方根本没注意,集合迟到的锅全甩给没提醒。点名提醒…
【游戏】 一、规则机制 一行定骨架:text = LANG[cur][key] or LANG.zh[key]。多语言文案的…
【语法】 一、机制原理 抛个坑:模板"$(name),您的$(item)已到账"这种带命名槽位的文案怎么填值?string.…
【游戏】 一、规则机制 抛个坑:横屏竖屏一切界面,控件坐标全按竖屏摆,一旋转错位满屏——适配该怎么做?两条策略配合:界面元素…