Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ ใช้ Linked List สร้าง Stack (สแต็ก)

Stack (สแต็ก) เป็นโครงสร้างข้อมูลแบบ LIFO (Last In, First Out) - ข้อมูลที่เข้าไปทีหลังจะออกก่อน

ออปเปอเรชันหลักของ Stack

  • Push: เพิ่มข้อมูลด้านบน (Top)
  • Pop: ลบข้อมูลด้านบน (Top)
  • Peek/Top: ดูข้อมูลด้านบนโดยไม่ลบ

โครงสร้าง Node

struct Node {
    int data;
    Node* next;
};

Node* top = nullptr;  // จุดชี้ด้านบนของสแต็ก

โค้ดโปรแกรม Stack ด้วย Linked List

#include <iostream>
using namespace std;

struct Node {
    int data;
    Node* next;
};

Node* top = nullptr;

void push(int val) {
    Node* newNode = new Node();
    newNode->data = val;
    newNode->next = top;  // ชี้ไป node เก่าที่ top
    top = newNode;        // top ชี้มาที่ node ใหม่
    cout << val << " pushed." << endl;
}

void pop() {
    if (top == nullptr) {
        cout << "Stack Underflow!" << endl;
        return;
    }
    
    Node* temp = top;
    cout << "Popped: " << top->data << endl;
    top = top->next;      // top ชี้ไป node ถัดไป
    delete temp;          // ปล่อยหน่วยความจำ
}

void display() {
    if (top == nullptr) {
        cout << "Stack is empty" << endl;
        return;
    }
    
    Node* ptr = top;
    cout << "Stack (top to bottom): ";
    while (ptr != nullptr) {
        cout << ptr->data << " ";
        ptr = ptr->next;
    }
    cout << endl;
}

int main() {
    int choice, val;
    
    do {
        cout << "\n1. Push\n2. Pop\n3. Display\n4. Exit\nChoice: ";
        cin >> choice;
        
        switch (choice) {
            case 1:
                cout << "Enter value: ";
                cin >> val;
                push(val);
                break;
            case 2:
                pop();
                break;
            case 3:
                display();
                break;
            case 4:
                cout << "Exiting..." << endl;
                break;
            default:
                cout << "Invalid choice!" << endl;
        }
    } while (choice != 4);
    
    // ทำความสะอาด
    while (top != nullptr) pop();
    
    return 0;
}

ผลลัพธ์ตัวอย่าง

1. Push
2. Pop
3. Display
4. Exit
Choice: 1
Enter value: 10
10 pushed.
Choice: 1
Enter value: 20
20 pushed.
Choice: 3
Stack (top to bottom): 20 10
Choice: 2
Popped: 20
Choice: 3
Stack (top to bottom): 10
Choice: 4
Exiting...

การทำงานของ Push และ Pop

Push (เพิ่มข้อมูล)

Top → [New] → [Old] → [Old] → NULL
      ↑
   newNode->next = top
   top = newNode

Pop (ลบข้อมูล)

Top → [Old] → [Old] → NULL
      ↑
   temp = top
   top = top->next
   delete temp

ข้อดีของ Linked List Stack

  • Dynamic Size: ไม่มีข้อจำกัดขนาด (จนกว่าจะหมด RAM)
  • No Overflow: ไม่ต้องกังวล Stack Overflow
  • Memory Efficient: จองหน่วยความจำเฉพาะที่ใช้

เปรียบเทียบ Array vs Linked List Stack

คุณสมบัติ Array Stack Linked List Stack
ขนาดคงที่ (Fixed)ไดนามิก (Dynamic)
Push/Pop Speedเร็วกว่า (Cache friendly)ช้ากว่าเล็กน้อย
Memoryจองล่วงหน้าจองตามใช้
Overflow Riskมีไม่มี (จนกว่า RAM เต็ม)