C C++ โครงสร้างข้อมูลแบบ Stack
Suttapak / September 16, 2022
3 min read • ––– views
โครงสร้างข้อมูลแบบ Stack
ข้อมูลที่เก็บใน Stack จะเก็บในลักษณะวางทับกัน เช่นเดียวกับการวางจานเรียงซ้อนกัน ข้อมูลตัวแรกจะเป็นข้อมูลที่อยู่ล่างสุดของ Stack และ ข้อมูลสุดท้ายจะเป็นข้อมูลที่อยู่บนสุด ของ Stack เมื่อมีการนำข้อมูลออกจาก Stack ข้อมูลที่อยู่บนสุด นั่นคือข้อมูลที่นำลงสู่Stack เป็นข้อมูลสุดท้าย จะเป็นข้อมูลที่จะต้องนำออกจาก Stack ก่อน การทำงานลักษณะนี้เรียกว่า LIFO (last-in-first-out)
class MyStack {
private:
int n =5;
int top = -1;
int arr [5];
public:
void push(int x);
int pop();
void display();
};
Push Stack
ฟังก์ชันนี้เป็นการนำข้อมูลเข้าสู่ Stack คือ ถ้า top น้อยกว่า MAX-1 (n คือค่า MAX) ซึ่งก็คือ ถ้า Stack ยังไม่เต็ม ก็ให้ top++ และเก็บข้อมูลที่ส่งมาทางพารามิเตอร์ what ลงไปในตัวแปร stackdata ช่องที่ top ชี้อยู่นั้นเอง จากนั้น return 1 กลับไปยังจุดที่เรียกใช้เป็นการบอกสถานะว่าตอนนี้ได้ push เรียบร้อยแล้วนั่นเอง แต่ถ้าเงื่อนไข if ไม่เป็นจริง มันก็จะลงมาทำที่ return-1 ดังนั้น ฟังก์ชันนี้คืนค่า -1 แสดงว่า stack เต็มแล้วนั่นเอง
using namespace std;
void MyStack::push(int x) {
if (this->top >= this->n-1) {
cout << "Stack Overflow" << endl;
return;
}
top ++;
this->arr[this->top] = x;
cout << "Inserted " << x << " to "<< this->top << " "<< endl;
this->display();
}
Pop Stack
การเอาข้อมูลออกจาก Stack ได้นั้น ก็เพียงแค่คืนค่าข้อมูลตัวที่ top นั้นชี้อยู่กลับไป แต่ก่อนที่จะ Pop ได้นั้นจะต้องดูด้วยว่า top นั้นเป็น -1 หรือไม่ ถ้าเป็น -1 ก็แสดงว่าตอนนั้น Stack ว่าง ให้คืนค่า -1 กลับไป แต่ถ้า top >-1 แสดงว่ามัมมีข้อมูลอยู่ภายใน Stack ดังนั้น ให้คืนค่าตัวที่ top ชี้อยู่กลับไป และลดค่า top ลงอีก 1
int MyStack::pop() {
if (this->top == -1){
cout << "Stack Empty." << endl;
return 0;
}
int data = this->arr[this->top];
this->arr[this->top] = NULL;
this->top --;
cout << "Removed " << data << " form "<< this->top+1 << " "<< endl;
this->display();
return data;
}
Code ตัวเต็ม
#include <iostream>
class MyStack {
private:
int n =5;
int top = -1;
int arr [5];
public:
void push(int x);
int pop();
void display();
};
using namespace std;
void MyStack::push(int x) {
if (this->top >= this->n-1) {
cout << "Stack Overflow" << endl;
return;
}
top ++;
this->arr[this->top] = x;
cout << "Inserted " << x << " to "<< this->top << " "<< endl;
this->display();
}
int MyStack::pop() {
if (this->top == -1){
cout << "Stack Empty." << endl;
return 0;
}
int data = this->arr[this->top];
this->arr[this->top] = NULL;
this->top --;
cout << "Removed " << data << " form "<< this->top+1 << " "<< endl;
this->display();
return data;
}
void MyStack::display() {
if (this->top == -1) return;
cout << "Top = "<< this->top << endl;
for (int i = 0;i<=this->top;i++) {
cout << "[" << i << "] -> " << this->arr[i] << " | " ;
}
cout << endl;
}
int main() {
MyStack myStack;
std::cout << "Matee Suttapak \n " ;
int menu;
char ans = 'y';
while (ans == 'y' || ans == 'Y') {
std::cout << "\nPls select menu [1]:Push [2]:Pop [3]:Show data " ;
std::cin >> menu ;
switch (menu) {
case 1 :
int data;
std::cout << "\nInsert data : " ;
std::cin>>data;
myStack.push(data);
break;
case 2:
myStack.pop();
break;
case 3:
myStack.display();
continue;
default:
std::cout << "Pls select 1 -> 2";
break;
}
}
}
โดย program ด้านบนจะเป็นการเขียนแบบเป็น Class หรือแบบ OOP ตั่งชื่อว่า MyStack เก็บ attribute 3 อย่าง
- n // เป็นจำนวนเต็มบ่งบอกของค่าของความจุสแตก
- top // เป็นตัวบงชี้ไปที่ค่าบนสุดของสแตก
- arr // เป็นข้อมูลแบบอาเรย์ใว้เก็บค่าของสแตก
- function push // ฟังก์ชันนำค่าเข้าไปเก็บในสแตก
- function pop // ฟังก์ชันนำค่าบนสุดออกจากสแตก
- function display // ฟังก์ชันแสดงค่าของสแตก