เนื่องจากสมาชิกในสแตกล้วนเป็นข้อมูลชนิดเดียวกัน การนำอาร์เรย์มาใช้เพื่อการสร้างสแตกย่อมช่วยให้ง่ายและไม่ซับซ้อน
ทุกครั้งที่มีการนำสมาชิกใหม่เข้าเก็บในสแตก ให้เพิ่มดัชนี (index) ที่กำกับช่องของอาร์เรย์อีก 1 (นับสมาชิกเพิ่มอีก 1) ในทางกลับกัน หากต้องการนำสมาชิกล่าสุดออกจากสแตก ก็ให้ลดดัชนีที่กำกับช่องของอาร์เรย์ลง 1 ช่อง จากนั้นจึงนำสมาชิกที่อยู่ด้านบนสุดของสแตกออก ในนี้จะเรียกดัชนีนี้ว่า top
การประกาศโครงสร้างสแตก
|
#define MAXSTACK 200 #define TRUE 1 #define FALSE 0
typedef int StackType ; typedef int Boolean ; typedef int ItemType ; StackType stack [MAXSTACK] ; int top ;
|
จากประกาศข้างต้น ตัวแปร stack เป็นอาร์เรย์ซึ่งเก็บค่าชนิดจำนวนเต็ม โดยมี top เป็นดัชนีเพื่อใช้สำหรับบ่งบอกถึงจำนวนของสมาชิกในอาร์เรย์
การเขียนโปรแกรมย่อยสำหรับโครงสร้างสแตก
/* การเขียนฟังก์ชันชื่อ clearStack (int *top)
{
*top = 0 ;
}
/*การเขียนฟังก์ชันชนิดบูลีนชื่อ emptyStack เพื่อทดสอบว่าสแตกว่างเปล่าหรือไม่*/
{
Boolean empty ;
if (*top = = 0)
empty = TRUE;
else
empty = FALSE;
return(empty);
}
/*การเขียนฟังก์ชันชนิดบูลีนชื่อ fullStack เพื่อทดสอบว่า สแตกเต็มแล้วหรือไม่ */
Boolean fullStack(const int *top)
{
Boolean full;
if (*top = = MAXSTACK)
full = TRUE;
else
full = FALSE;
return(full) ;
}
/*การเขียนฟังก์ชันชื่อ push เพื่อจัดการนำสมาชิกใหม่เข้าเก็บในสแตก /*
void push(StackType stack [ ], int *top, ItemType item)
{
Stack[*top] = item;
(*top) + +;
}
/*การเขียนฟังก์ชันชื่อ pop เพื่อจัดการเอาสมาชิกตัวบนสุดออกจากสแตก */
void pop(StackType stack [ ], int *top, ItemType item)
{
(*top) - - ;
*item = Stack[*top] ;
}
การเรียกใช้ฟังก์ชันทั้ง 5 ทำได้ดังนี้
clearStach(&top) ;
emptyStack(&top) ;
fullStack(&top) ;
push(Stack, &top, item) ;
pop(Stack, &top, &item) ;
โมดูลทั้ง 5 ข้างต้น จำเป็นต้องส่ง pop เป็นพารามิเตอร์เพิ่มอีกตัวเพื่อใช้ในฟังก์ชัน push และ pop กล่าวคือ หากต้องการเรียกไปที่ push ต้องใช้พารามิเตอร์ 3 ตัวด้วยคำสั่ง push(stack, &top, item) และหากต้องการเรียกไปที่ pop ก็ต้องใช้พารามิเตอร์ 3 ตัวด้วยคำสั่ง pop (stack, &top, &item) ดังนั้นหนทางหนึ่งที่สามารถช่วยลดจำนวนการส่งพารามิเตอร์ไปยัง push และ pop ก็คือการรวมเอาค่าของ top เก็บไว้ในอาร์เรย์ซึ่งใช้เป็นสแตกสำหรับการเก็บสมาชิกทั้งหมด วิธีการนี้สามารถทำได้ด้วยการใช้ขอบเขตล่าง (Lower Bound) ของอาร์เรย์ซึ่งก็คือช่วงศูนย์ใช้เก็บค่าของ top ดังภาพ
stack
. . .
0 ← stack[0] ก็คือค่าของ top
1← สมาชิกตัวแรกในสแตก
2 ←สมาชิกตัวที่สองในสแตก
3 ← สมาชิกตัวที่สามในสแตก
.
.
.
ดังนั้น stack [0] สามารถนำมาใช้สำหรับการเก็บดัชนีหรือค่าของ top ได้หากนำแนวทางนี้มาใช้ การประกาศที่ผ่านมาจำเป็นต้องมีการปรับเปลี่ยนเล็กน้อย โดยการตัดประกาศของ top ทิ้งไป แล้วเพิ่มขนาดของ MAXSTACK อีก 1 ดังนี้
#define MAXSTACK 200+1
นอกจากนี้โมดูลทั้ง 5 จำเป็นต้องแก้ไขใหม่เพื่อให้สอดคล้องกับประกาศ
Void clearStack(StackType stack[] )
{
stack[0] = 0;
}
Boolean emptyStack (const StackType stack[])
{
Boolean empty ;
if (stack[0] = = 0)
empty = FALSE ;
return(empty) ;
}
Boolean fullStack(const StackType stack[])
{
Boolean full ;
if (stack [0] = = MAXSTACK-1)
full = TURE ;
Else
Full = FALSE ;
Return(full) ;
}
void push(StackType stack [], ItemType item)
{
stack[0]+ + ;
stack[stack[0]] = item;
}
void pop (StackType stack[], ItemType *item)
{
*item = stack[stack[0]];
Stack[0] - - ;
}
การเรียกใช้ฟังก์ชันทั้ง 5 ทำได้ดังนี้
clearStach(stack) ;
emptyStack(stack) ;
fullStack(stack) ;
push(Stack, , item) ;
pop(Stack, , &item) ;
สวัสดีคะ น้องอิสราพร
พี่เป็นผู้ดูแลเว็บไซต์คะ และได้ลองอ่านบันทึกทั้งหมดในบล็อกของน้องแล้ว คิดว่าวัตถุประสงค์ของการใช้งานบล็อกของน้อง คงจะเพื่อการส่งการบ้าน หรือส่งงานให้อาจารย์
พี่รบกวนน้องย้ายบล็อกเพื่อส่งการบ้านไปยัง http://learners.in.th คะ ซึ่งใช้งานเช่นเดียวกัน GotoKnow.org
โดย Learners.in.th นั้น เป็นบล็อกเพื่อการเรียนการสอน ดังนั้นน้องๆ นักศึกษาสามารถเขียนบล็อกเพื่อส่งงานที่นี่ได้คะ
สำหรับ GotoKnow.org เป็นบล็อกที่มีวัตถุประสงค์สำหรับการแลกเปลี่ยนประสบการณ์คะ