การดู : 0

12/04/2026 18:17น.

JS2GO EP.31 การใช้งาน Queues และ Stacks ใน JavaScript กับ Go

JS2GO EP.31 การใช้งาน Queues และ Stacks ใน JavaScript กับ Go

#JavaScript

#Go

#Queues

#Stacks

Queues และ Stacks เป็น Linear Data Structures ที่ใช้จัดการข้อมูลในลำดับเฉพาะ ซึ่งสำคัญสำหรับการจัดการ task, recursion, undo/redo หรือระบบ queue ในโปรเจกต์จริง บทความนี้สอนการสร้างและใช้งาน Queues และ Stacks ใน JavaScript และ Go พร้อมตัวอย่างโค้ดและแนวทางปฏิบัติที่เหมาะสม

 

1. Stack

 

Stack คือโครงสร้างข้อมูลแบบ LIFO (Last In, First Out)

 

JavaScript: Stack ด้วย Array

const stack = [];

// Push
stack.push(1);
stack.push(2);
stack.push(3);

console.log(stack); // [1,2,3]

// Pop
const top = stack.pop();
console.log(top);   // 3
console.log(stack); // [1,2]

 

แนวทาง JavaScript:
✔️ ใช้สำหรับ undo/redo, function call, recursion
✔️ Array ของ JS สามารถใช้ push/pop ได้ตรงตัว

 

Go: Stack ด้วย Slice

package main

import "fmt"

func main() {
    stack := []int{}

    // Push
    stack = append(stack, 1)
    stack = append(stack, 2)
    stack = append(stack, 3)
    fmt.Println(stack) // [1 2 3]

    // Pop
    top := stack[len(stack)-1]
    stack = stack[:len(stack)-1]
    fmt.Println(top)   // 3
    fmt.Println(stack) // [1 2]
}

 

แนวทาง Go:
✔️ Slice สามารถ append/pop ได้ง่าย
⚠️ ต้องระวัง index out of range

 

2. Queue

 

Queue คือโครงสร้างข้อมูลแบบ FIFO (First In, First Out)

 

JavaScript: Queue ด้วย Array

const queue = [];

// Enqueue
queue.push(1);
queue.push(2);
queue.push(3);

// Dequeue
const first = queue.shift();
console.log(first); // 1
console.log(queue); // [2,3]

 

แนวทาง JavaScript:
✔️ ใช้สำหรับ task scheduling, event queue
⚠️ Array shift() มี performance cost สำหรับ array ขนาดใหญ่ → ใช้ linked list หรือ deque สำหรับ production

 

Go: Queue ด้วย Slice

package main

import "fmt"

func main() {
    queue := []int{}

    // Enqueue
    queue = append(queue, 1)
    queue = append(queue, 2)
    queue = append(queue, 3)

    // Dequeue
    first := queue[0]
    queue = queue[1:]
    fmt.Println(first) // 1
    fmt.Println(queue) // [2 3]
}

 

แนวทาง Go:
✔️ Slice สามารถใช้ append/dequeue ได้
⚠️ สำหรับ queue ขนาดใหญ่ ควรใช้ container/list เพื่อ efficiency

 

3. การใช้งาน Queues และ Stacks จริง

 

✔️ Undo/Redo: ใช้ stack สำหรับเก็บสถานะก่อนหน้า
✔️ Task scheduling: ใช้ queue สำหรับงาน background
✔️ DFS/BFS algorithms: Stack/Queue เป็นโครงสร้างหลัก
✔️ Concurrent Queue (Go): ใช้ channel แทน queue สำหรับ concurrency

 

ตัวอย่าง Go: Concurrent Queue ด้วย Channel

ch := make(chan int, 5)
go func() {
    for i := 1; i <= 5; i++ {
        ch <- i // Enqueue
    }
    close(ch)
}()

for val := range ch {
    fmt.Println(val) // Dequeue
}

 

4. สรุปเปรียบเทียบ JavaScript vs Go

FeatureJavaScriptGo
StackArray.push()/pop()Slice append/pop
QueueArray.push()/shift()Slice append/dequeue or channel
Type Safety❌ No✔️ Yes
Concurrent QueueManual / libraryChannel (built-in)
Use CasesUndo/Redo, recursionTask scheduling, concurrency

 

คำแนะนำ:
✔️ Frontend / lightweight tasks → ใช้ JavaScript Array stack/queue
✔️ Backend / concurrent tasks → ใช้ Go slice stack/queue หรือ channel

 


 

ตอนต่อไป

 

ใน EP.32 ของซีรีส์ JS2GO เราจะพาคุณไปเรียนรู้ การใช้งาน Linked Lists ใน Go เทียบกับ JavaScript เพื่อเข้าใจการจัดการข้อมูลแบบ dynamic nodes และประยุกต์ใช้งานในโครงสร้างข้อมูลที่ซับซ้อน

 

อ่านบทความ Series อื่นๆ

🔵 Facebook: https://www.facebook.com/superdev.academy.th

🔴 YouTube : Superdev Academy

📸 Instagram: Superdev Academy

🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH

🌐 Website: https://www.superdevacademy.com/