stack as a static Array

เนื่องจากสมาชิกในสแตกล้วนเป็นข้อมูลชนิดเดียวกัน การนำอาร์เรย์มาใช้เพื่อการสร้างสแตกย่อมช่วยให้ง่ายและไม่ซับซ้อน

                ทุกครั้งที่มีการนำสมาชิกใหม่เข้าเก็บในสแตก ให้เพิ่มดัชนี (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สมาชิกตัวแรกในสแตก                         

สมาชิกตัวที่สองในสแตก

สมาชิกตัวที่สามในสแตก

                                                                   .

                                                                  .

                                                                  .                      

   ดังนั้น 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) ;