สแต็คคือโครงสร้างข้อมูลเชิงเส้นที่มีการรวบรวมรายการซึ่งปฏิบัติตามหลักการ Last-In-First-Out (LIFO) ส่วนบนของสแต็คคือรายการที่ถูกเพิ่มเข้ามาในสแต็คล่าสุด และส่วนล่างของสแต็คคือรายการที่ถูกเพิ่มเข้ามาน้อยที่สุด
คุณสามารถคิดว่าการสร้างข้อมูลสแต็คเหมือนกับการวางจานอาหาร: คุณเริ่มจากจานหนึ่ง แล้วจากนั้นคุณก็วางอีกจานหนึ่งไว้ข้างบน เมื่อคุณหยิบจานออกจากสแต็ค จาน แรก ที่คุณนำออกจากสแต็คคือจาน สุดท้าย ที่คุณวางอยู่บนสุด
สแต็คมีการทำงานหลักสองอย่าง: push สำหรับการเพิ่มองค์ประกอบเข้าไปในด้านบนของสแต็ค และ pop สำหรับการเอาองค์ประกอบออกจากด้านบนของสแต็ค สแต็คสามารถมีขนาดคงที่หรือมีขนาดที่ปรับได้ตามต้องการ สแต็คมีประโยชน์ในด้านการออกแบบ เช่น อัลกอริธึมการย้อนกลับ
การสร้างสแต็ค
แม้ว่าลัวจะไม่มีสแต็คเป็นโครงสร้างข้อมูลที่มีในตัว แต่คุณสามารถใช้ ตาราง เพื่อสร้างสแต็คได้ ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการสร้างสแต็ค, push ตัวแปรไปยังสแต็ค และ pop ตัวแปรออกจากสแต็ค เพื่อใช้การสร้างนี้ในเกมของคุณ คุณควรบันทึกเป็น ModuleScript และเก็บไว้ใน ReplicatedStorage เพื่อให้สแต็คของคุณสามารถเข้าถึงได้ทั้งจากฝั่งลูกค้าและเซิร์ฟเวอร์
local Stack = {}
Stack.__index = Stack
function Stack.new()
local self = setmetatable({}, Stack)
self._stack = {}
return self
end
-- ตรวจสอบว่าสแต็คว่างเปล่าหรือไม่
function Stack:isEmpty()
return #self._stack == 0
end
-- ใส่ค่าใหม่ลงในสแต็ค
function Stack:push(value)
table.insert(self._stack, value)
end
-- เอาค่าจากสแต็คออก
function Stack:pop()
if self:isEmpty() then
return nil
end
return table.remove(self._stack, #self._stack)
end
return Stack
ตัวอย่างโค้ดต่อไปนี้เป็นตัวอย่างการใช้งานในรูปแบบ Script ภายใต้ Workspace คุณสามารถปรับเปลี่ยนโค้ด ชนิด และที่เก็บข้อมูลให้เหมาะกับการใช้งานของคุณเอง ตราบใดที่คุณมีโค้ดการทำงานก่อนหน้านี้ที่เก็บไว้อย่างถูกต้อง
ตัวอย่างการใช้งานสแต็คlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Stack = require(ReplicatedStorage:WaitForChild("Stack"))local s = Stack.new()-- เปลี่ยนแปลงสแต็ค สแต็คที่ได้ผลลัพธ์ เอาท์พุตs:push(1) -- {1}s:push(5) -- {1, 5}s:push(10) -- {1, 5, 10}print(s:pop()) -- {1, 5} 10print(s:pop()) -- {1} 5s:push(20) -- {1, 20}print(s:pop()) -- {1} 20print(s:pop()) -- {} 1
หากคุณเรียกใช้ตัวอย่างโค้ดข้างต้นโดยไม่เปลี่ยนแปลงอะไร ค่าที่คาดหวังที่ได้คือ:
ผลลัพธ์ตัวอย่าง105201