5 stacks 2
Download
1 / 56

บทที่ 5 สแต๊ก ( Stacks ) (ส่วนที่ 2) - PowerPoint PPT Presentation


  • 135 Views
  • Uploaded on

บทที่ 5 สแต๊ก ( Stacks ) (ส่วนที่ 2). By Juthawut Chantharamalee. Abstract Data Type ของสแต็ก ( Stack ADT ).

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' บทที่ 5 สแต๊ก ( Stacks ) (ส่วนที่ 2)' - christmas


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
5 stacks 2

บทที่ 5 สแต๊ก (Stacks)(ส่วนที่ 2)

By Juthawut Chantharamalee

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Abstract data type stack adt
Abstract Data Type ของสแต็ก (Stack ADT)

ก่อนจะเข้าถึงเนื้อหาของเนื่องสแต็ก ADT จะขอทบทวนเพื่อสรุปโครงสร้างข้อมูลแบบสแต็กนั้นจะเป็นลิสต์ที่มีข้อจำกัดหลายประการดังเงื่อนไขต่อไปนี้ 1. การเพิ่มสมาชิกหรือข้อมูลจะสามารถจัดเก็บเรียงตามลำดับจากปลายด้านใดด้านหนึ่งเท่านั้น เช่น จากส่วนบนสุด หรือจากส่วนล่าสุด2. รายการเพิ่มข้อมูลเข้าไปจะอยู่บนสุด 3. เราสามารถเข้าถึงรายการข้อมูลในสแต็กได้ ณ ส่วนบนสุดเท่านั้น ไม่ว่าจะเป็นการอ่านข้อมูลด้วย Stack Top หรือนำข้อมูลออกด้วย Pop

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


4. การดำเนินงานใดๆ บนสแต็กจะเป็นไปตามประสิทธิภาพของฟังก์ชันO(1) อัลกอริทึมแต่ละชนิดจากเนื้อหาข้างต้นที่ผ่านมา สามารถนำมาใช้เขียนโปรแกรมเพื่อดำเนินงานกับสแต็กได้อย่างหลากหลาย แต่สำหรับ เนื้อหาต่อไปนี้ ต้องการนำเสนอสแต็กในรูปแบบของ ADT เป็นสำคัญ เพื่อสามารถนำไปเก็บไว้ในไลบรารีเพื่อเรียกใช้งานได้ต้องการ โดยในที่จะพัฒนาสแต็ก ADT ด้วยการใช้โครงสร้างข้อมูลแบบลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


main บนสแต็กจะเป็นไปตามประสิทธิภาพของฟังก์ชัน

Dynamic memory

data

stack

N

link

count

top

dataPtr

data

link

dataPtr

.

.

data

dataPtr

link

รูปที่ 5.13 แนวคิกโครงสร้างของสแต็ก ADT (Stack ADT Structural Concepts)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ทั้งโหนดส่วนหัวและโหนดข้อมูลจะถูกเก็บซ่อนรายละเอียดไว้ใน ADT การเรียกใช้ฟังก์ชันของสแต็ก ก็คือพอยน์เตอร์ที่ชี้ไปยังโครงสร้างสแต็กใน ADT นั้นเอง ส่วนการสร้างสแต็ก โปรแกรมเมอร์จะนิยามพอยน์เตอร์เพื่อชี้ไปยังสแต็ก ซึ่งแสดงได้จากตัวอย่างชุดคำสั่งด้านล่างต่อไปนี้ โดยโครงสร้างสแต็ก ADT ที่แสดงดังรูปที่ 5.13 จะทำให้เห็นภาพแนวคิดดังกล่าวได้ชัดเจนยิ่งขึ้น

STACK* stack

..

..

Stack = createStack ();

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อย่างไรก็ตาม ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง ADT จะต้องมีตัวดำเนินงานที่ใช้สนับสนุนการทำงานในแต่ละฟังก์ชันของสแต็กอย่างเพียงพอ เช่น การพัฒนาฟังก์ชันด้วยภาษา C ซึ่งประกอบด้วย Stack Definitions, Create Stack, Push Stack, Pop Stack, Stack Top, Empty Stack, Stack Count และ Destroy Stack ซึ่งแสดงได้ดังตัวอย่างต่อไปนี้

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


1 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง

2

3

4

5

6

7

8

9

10

11

12

// Stack ADT Type Definitions

typedef struct node

{

void* dataPtr;

struct node* link;

} STACK_NODE;

typedef struc

{

int count ;

STACK_NODE* top;

} STACK;

โปรแกรมที่ 5.1 Stack ADT Definitions

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


โปรแกรมที่ 5.2 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง Create Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


โปรแกรมที่ 5.3 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง Push Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


โปรแกรมที่ 5.4 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง Pop Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


1 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง

2

3

4

5

6

7

8

9

10

11

12

13

14

/*=================== stackTop ===============

Retrieves data from the top of stack without changing the stack.

Pre stack is a pointer to the stack

Post Returns data pointer if successful

null pointer if stack empty

*/

void* stackTop (STACK* stack)

{

// Statements

if (stack->count == 0)

return NULL;

else

return stack->top->dataPtr;

} //stackTop

โปรแกรมที่ 5.5 Retrieve Stack Top

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


1 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง

2

3

4

5

6

7

8

9

10

/*================= emptyStack ==================

This function determines if a stack is empty.

Pre stack is pointer to a stack

Post Returns 1 if empty; 0 if data in stack

*/

bool emptyStack (STACK* stack)

{

// Statements

return (stack->count == 0);

} //emptyStack

โปรแกรมที่ 5.6 Empty Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


โปรแกรมที่ 5.7 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง Full Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


1 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง

2

3

4

5

6

7

8

9

10

/*============= stackCount ============

Returns number of elements in stack.

Pre stack is a pointer to the stack

Post count returned

*/

int stackCount (STACK* stack)

{

// Statements

return stack->count;

} //stackCount

โปรแกรมที่ 5.8 Stack Count

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


โปรแกรมที่ 5.9 ยังมีสิ่งที่ต้องคำนึงนอกเหนือจากโครงสร้างข้อมูลที่นำมาสร้าง Destroy Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การนำสแต็กไปประยุกต์ใช้กับโปรแกรมการนำสแต็กไปประยุกต์ใช้กับโปรแกรม

โดยปกติการเขียนโปรแกรมมักเขียนในลักษณะโมดูลหรือโปรแกรมย่อย โดยโปรแกรมหลักจะทำการเรียกใช้โปรแกรมย่อยต่างๆ เพื่อใช้งาน ดังนั้นโครงสร้างข้อมูลแบบสแต็กจะสามารถนำมาประยุกต์ใช้เพื่อทำงานกับกรณีดังกล่าวได้เป็นอย่างดี โดยส่วนโปรแกรมที่มีการเรียกใช้งานโปรแกรมย่อย จะมีการ Push ลำดับคำสั่งที่ต้องการประมวลผลในลำดับถัดไว้ในสแต็ก

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


เพื่อจะได้สามารถรีเทิร์นกลับมาทำกลับมาทำงานต่อจากตัวที่เรียกได้ และเมื่อมีการประมวลผลชุดคำสั่งในโปรแกรมย่อยที่เรียกใช้งานจนเสร็จ ก็จะทำการ Pop ลำดับคำสั่งออกจากสแต็ก เพื่อจะได้กลับไปทำงานยังลำดับคำสั่งที่เรียกใช้โปรแกรมย่อยนั้นได้ต่อไป

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Call และเมื่อมีการประมวลผลชุดคำสั่งในโปรแกรมย่อยที่เรียกใช้งานจนเสร็จ ก็จะทำการ

Task A

……..

……..

Task B

……..

……..

Call

Return

Task C

……..

……..

Call

Return

Task D

……..

……..

Return

รูปที่ 5.14 ตัวอย่างโปรแกรมแสดงลำดับการเรียกโปรแกรมย่อยเพื่อใช้งาน

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


จากรูปที่ 5.14 เป็นตัวอย่างโปรแกรมแสดงลำดับการเรียกโปรแกรมย่อยเพื่อใช้งาน โดยที่ Task A ได้เรียกใช้งาน Task B และ Task B ได้มีการเรียกใช้งาน Task C ในขณะที่ Task C ก็ได้เรียกใช้งาน Task D จนกระทั้งจบที่ Task D ก็มีการรีเทิร์นกลับไปยัง Task ก่อนหน้าที่เรียกใช้งาน จนกระทั้งจบโปรแกรม

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


C เป็นตัวอย่างโปรแกรมแสดงลำดับการเรียกโปรแกรมย่อยเพื่อใช้งาน โดยที่

B

B

A

A

A

(b)

(a)

(c)

(d)

B

A

A

(e)

(f)

(g)

รูปที่ 5.15 แสดงถึงโปรแกรมย่อยต่าง ที่ Push ลงในสแต็กและ Pop ออกจากสแต็กในแต่ละสถานการณ์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Stack applications
การประยุกต์ใช้งานสแต็ก (Stack Applications)

การเรียงลำดับข้อมูลแบบย้อนกลับ (Reversing Data)

คือการจัดเรียงลำดับข้อมูลใหม่ ตัวอย่างเช่น ข้อมูลในสแต็กที่มีข้อมูลตัวเลขลำดับจาก Top ลงไปคือ {4 3 2 1} เมื่อมีการจัดเรียงใหม่ลงในสแต็กหนึ่งก็จะลำดับใหม่มาเป็น {1 2 3 4} เป็นต้น

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Pop (

4

1

3

2

2

3

4

1

Stack 2

Stack 1

รูปที่ 5.16 การเรียงลำดับข้อมูลย้อนกลับด้วยสแต็ก

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การแตกข้อมูลออกเป็นส่วนๆ (Parsing)

เป็นการแตกข้อมูลออกเป็นส่วนๆ ให้เป็นอิสระต่อกัน เพื่อส่งไปประมวลผล ตัวอย่างเช่น การแปลซอร์สโค้ดให้เป็นภาษาเครื่อง ซึ่งคอมไพเลอร์จะดำเนินการแตกโปรแกรมออกเป็นส่วนๆ ให้เป็นอิสระกัน เช่น คำสงวน ตัวแปร และโทเค้น (Tokens) เป็นต้น นอกจากนี้แล้ว การแตกข้อมูลออกเป็นส่วนยังสามารถนำไปใช้กับการตรวจสอบการจับข้อมูลของเครื่องหมายวงเล็บในนิพจน์คณิตศาสตร์ได้อีกด้วย

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


? (

( ( A + B ) / C

(a) Opening parenthesis not matched

?

( A + B ) / C )

(b) Closing parenthesis not matched

รูปที่ 5.17 การแตกข้อมูลออกเป็นส่วนๆ เพื่อตรวจสอบการจับข้อมูลของเครื่องหมายวงเล็บ

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การหน่วงเวลา ( (Postponement)

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

การย้อนรอย (Backtracking Steps)

เป็นการย้อนรอยเพื่อไปยังสถานะก่อนหน้า รวมถึงการค้นหาเส้นทางการเดินทางเพื่อไปยังเป้าหมายปลายทาง (Goal Seeking)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


6 (

7

4

Star node

8

5

11

9

10

The goal

1

2

3

13

12

14

15

16

17

18

รูปที่ 5.18 การค้นหาเส้นทางการเดินทางเพื่อไปยังเป้าหมาย

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


นิพจน์ทางคณิตศาสตร์ (

1. นิพจน์ Infix คือ นิพจน์โดยทั่วไปที่มักจะใช้กับการคำนวณสูตรตัวเลขต่างๆ โดยโอเปอเรเตอร์จะอยู่ระหว่างโอเปอแรนด์

2. นิพจน์ Postfix คือ นิพจน์ในรูปแบบโอเปอเรเตอร์จะอยู่ข้างหลังตัว โอเปอแรนด์

3. นิพจน์ Prefix คือ นิพจน์ในรูปแบบโอเปอเรเตอร์จะอยู่ข้างหน้าตัว โอเปอแรนด์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Operator (

A + X1 * 2

Operand

Prefix : +AB

Infix : A+B

Postfix : AB+

รูปที่ 5.19 นิพจน์คณิตศาสตร์ประกอบไปด้วยโอเปอเรเตอร์และโอเปอแรนด์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การแปลงนิพจน์ (Infix มาเป็น Postfix ด้วยมือ

คอมไฟเลอร์หรือตัวแปลภาษายุคใหม่ในปัจจุบัน จะไม่สามารถแปลนิพจน์ Infix เป็นภาษาเครื่องได้โดยตรง อันเนื่องมาจากการจัดลำดับความสำคัญของโอเปอเรเตอร์ที่แตกต่างกันในนิพจน์ Infix จึงทำให้การคำนวณแต่ละเทอมในนิพจน์มาเป็นไปตามลำดับ และยิ่งสูตรการคำนวณที่ซับซ้อน ก็ยิ่งทวีความยุ่งยากให้กับคอมไพเลอร์ในการคำนวณหาผลลัพธ์มากเท่านั้น แต่อย่างไรก็ตามคอมไพเลอร์สามารถแก้ปัญหาโยการแปลงนิพจน์ Infix ให้มาเป็นนิพจน์แบบ Postfix หรือ Prefix เสียก่อน

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


กฎเกณฑ์สำหรับการแปลงนิพจน์ Infix มาเป็น Postfix ด้วยมือ

1. ให้ทำการใส่เครื่องหมายวงเล็บให้กับทุกๆ นิพจน์ด้วยการคำนึงถึงลำดับการคำนวณ เช่น เครื่องหมายคูณและหารต้องมาก่อนเครื่องหมายบวกและลบ เป็นต้น

2. ทำการเปลี่ยนสัญลักษณ์ Infix ในแต่ละวงเล็บให้มาเป็นสัญลักษณ์แบบ Postfix โดยให้เริ่มต้นจากนิพจน์ที่อยู่วงเล็บในสุดก่อน จากนั้นก็ดำเนินการแปลงเป็นนิพจน์ Postfix ด้วยการย้ายโอเปอเรเตอร์ตรงตำแหน่งวงเล็บนั้นไปยังตำแหน่งวงเล็บปิดของคู่นั้นๆ 3. ถอดเครื่องหมายวงเล็บออกทิ้งให้หมด

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ตัวอย่างที่ 5.1 จงแปลงนิพจน์ A + B * C มาเป็น Postfix ด้วยมือ

นิพจน์ Infix ที่ให้มา A + B * C

ขั้นตอนที่ 1 ใส่วงเล็บให้ทั้งหมดตามลำดับความสำคัญ

(A + (B * C))

ขั้นตอนที่ 2 พิจารณานิพจน์ที่อยู่ในวงเล็บในสุด โดยย้ายเครื่องหมาย * ไปข้างหลัง C

(A + (BC*))

จากนั้นให้ย้ายโอเปอเรเตอร์ + ซึ่งอยู่ที่ตำแหน่งวงเล็บเปิดภายนอกของคู่ตัวเอง

(A (BC*) + )

ขั้นตอนที่ 2 ถอดเครื่องหมายวงเล็บทิ้งออกให้หมด

ABC*+

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ตัวอย่างที่ 5.2 จงแปลงนิพจน์ 5 + 6 - 10 มาเป็น Postfix ด้วยมือ

5 * 6 -10 = ((5 * 6)-10)

= ((56*)- 10)

= ((56*)10-)

= 56*10-

และจากนิพจน์ Postfix ที่ได้จากตัวอย่างที่ 5.2 นั้น คือผลลัพธ์จากการเรียงลำดับตามกฎเกณฑ์ของ postfix ดังนั้นคอมไพเลอร์ก็สามารถทำการคำนวณหาผลลัพธ์ได้อย่างง่ายดาย

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Expression จงแปลงนิพจน์

Action

Stack

5 6 * 10 -

Push 5

5

5 6 * 10 -

Push 6

6

5

5 6 * 10 -

Pop 6 and 5

Evaluate 5 * 6

Push 30

30

5 6 * 10 -

Push 10

10

30

5 6 * 10 -

Pop 10 and 30

Evaluate 30 - 10

Push 20

20

5 6 * 10 -

Pop 20

Stack is Empty

Result is 20

รูปที่ 5.20 แสดงการคำนวณหาผลลัพธ์นิพจน์ Postfix ในสแต็ก

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อัลกอริทึมสำหรับการแปลงนิพจน์ Infix มาเป็น นิพจน์ Postfix (Algorithmic Transformation)

อัลกอริทึมการแปลงนิพจน์ Infix มาเป็น Postfix มีขั้นตอนดังนี้ 1. ถ้าข้อมูลเข้ามาเป็นโอเปอแรนด์ ให้เอาต์พุตไป Postfix 2. ถ้าข้อมูลเข้าเป็นโอเปอเรเตอร์ - ถ้าสแต็กว่างให้ Push ลงในสแต็ก - ถ้าภายในสแต็กมีข้อมูลอยู่ ให้ทำการเปรียบเทียบ ดังนี้ -ถ้าโอเปอเรเตอร์ที่อินพุตเข้ามามีลำดับความสำคัญน้อยกว่า หรือ เท่ากับโอเปอเรเตอร์ที่อยู่ส่วนบนของสแต็ก ให้ดำเนินการ Pop

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


- สแต็กออกไปที่ Postfix โดยทำการเปรียบเทียบกับโอเปอเรเตอร์ ที่มีอยู่ในสแต็กไปเรื่อยๆ จนกระทั้งโอเปอเรเตอร์ที่อินพุตเข้ามามีลำดับความสำคัญมากกว่าโอเปอเรเตอร์ในสแต็ก จากนั้นดำเนินการ Push โอเปอเรเตอร์ที่อินพุตเข้ามาลงในสแต็ก 3. ถ้าข้อมูลเข้าเป็นเครื่องหมายวงเล็บเปิด ให้ดำเนินการ Push ลงในสแต็ก4. ถ้าข้อมูลเข้าเป็นเครื่องหมายวงเล็บปิด ให้ดำเนินการ Pop สแต็กไปยัง Postfix จนกระทั้งพบเครื่องหมายปิด จากนั้นให้นำเครื่องหมายวงเล็บทั้งสองลบทิ้งไป5. หากดำเนินการขนเสร็จสิ้นแล้วยังมีข้อมูลอยู่ในสแต็ก ให้ดำเนินการ Pop ที่เหลืออยู่ทั้งหมดไปยัง Postfix

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Infix

Stack

Postfix

(a)

A

A

(b)

+

+

A

(c)

B

+

A B

(d)

*

*

A B

+

(e)

*

*

A B C

+

(f)

-

A B C * +

-

(g)

D

A B C * + D

-

(h)

/

/

A B C * + D

-

(i)

E

/

A B C * + D E

-

(j)

A B C * + D E / -

รูปที่ 5.21 การแปลงนิพจน์ Infix มาเป็นนิพจน์ Postfix

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อัลกอริทึมที่ 5.9 การแปลงนิพจน์ Infix มาเป็น Postfix (Convert Infix to Postfix)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ตัวอย่างที่ 5.3 จงแปลง การแปลงนิพจน์ A * B –(C + D) ให้เป็น Postfix

Input (Infix)

Operator Stack

Output String (Postfix)

A

A

*

*

A

B

*

A B

-

-

A B *

(

- (

A B *

C

-(

A B * C

+

- ( +

A B * C

D

- ( +

A B * C D

)

-

A B * C D +

+

+

A B * C D + -

E

+

A B * C D + - E

A B * C D + - E +

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การผลลัพธ์จากนิพจน์ การแปลงนิพจน์ Postfix (Evaluation Postfix Expressions)

หลักการหาผลลัพธ์จากนิพจน์ Postfix ก็คือ จะทำการสแกนนิพจน์ Postfix จากซ้ายไปขวา โดยโอเปอแรนด์ที่พบจะถูกใส่ไว้ในสแต็กเรื่อยๆ จนกระทั้งพบตัวโอเปอเรเตอร์ เมื่อพบแล้วจึงดำเนินการหาผลลัพธ์จากคู่โอเปอแรนด์ที่พบก่อนหน้า ผลการคำนวณจะเป็นไปตามขั้นตอนดังรูปที่ 5.22 ส่วนอัลกอริทึมการหาผลลัพธ์จากนิพจน์ Postfix แสดงไว้ในอัลกอริทึมที่ 5.10 ในที่นี้ขอยกตัวอย่างนิพจน์ Postfix เพื่อนำไปคำนวณหาผลลัพธ์ดังนี้

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


A B C + * การแปลงนิพจน์

โดยที่ A=2 B = 4 และ C = 6

Postfix

Stack

(a)

2 4 6 + *

(b)

4 6 + *

2

4

(c)

6 + *

2

6

(d)

+ *

4

2

4 * 6 = 10

(e)

*

10

2

2 * 10 = 20

(f)

20

รูปที่ 5.22 การคำนวณหาผลลัพธ์ของนิพจน์ Postfix

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm postFixEvaluate (expr) การแปลงนิพจน์

This algorithm evaluates a postfix expression and returns its value.

Pre a valid expression

Post postfix value computed

Return value of expression

1 ereateStack (stack)

2 loop (for each character)

1 if (character is operand)

1 pushstaek (stack, character)

2 else

1 popStaek (stack, oper2)

2 popStack (stack, operl)

3 operator = character

4 set value to calculate (operl, operator, oper2)

5 pushstack (stack, value)

3 end if

3 end loop

4 popStack (stack, result)

5 return (result)

end postFixEvaluate

อัลกอริทึมที่ 5.10 การหาผลลัพธ์จากนิพจน์ Postfix (Evaluation of Postfix Expressions

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์ (Stack Array Algorithm)

สำหรับการสร้างสแต็กด้วยอาร์เรย์ในที่นี้ จะเริ่มต้นที่ลำดับที่ 0 (ในภาษา C) โดยภายในอาร์เรย์จะมีข้อมูลเพิ่มในกรณีที่มีการเพิ่มราบการข้อมูลเข้าไปด้วยฟังก์ชัน Push ในขณะที่ภายในอาร์เรย์จะมีข้อมูลลดน้อยลงเมื่อมีการนำข้อมูลออกไปด้วยฟังก์ชัน Pop และการ Push รายการเข้าไป ก็จะมีการเพิ่มตัวนับอีกตัวเข้าไป ซึ่งจะใช้ซับสคริปต์เป็นตัวอ้างอิงที่ส่วนบนสุดของสแต็ก และการ Pop ก็จะทำการคัดลอกข้อมูลข้อมูลตำแหน่งซับสคริปต์ที่อยู่ส่วนบนสุดของสแต็กไปยังโมดูลที่เรียกใช้แล้วจึงลดค่าของซับสคริปต์ลงอีกหนึ่งจากส่วนบนสุดลงมา

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์createStack (stackElem <integer>)

Allocates memory for a. stack head node from, dynamic memory

and returns its address to the caller.

Pre stackElem contains size of stack

Post head node and array allocated or error returned

Return pointer to head node or null pointer if no memory

1 if(memory not available

1 stackPtr = null )

2 else }

1 allocate (stackPtr)

Head allocated. Now initialize and allocate stack array.

2 stackPtr -> count = 0

3 stackPtr -> top = -1

4 stackPtr -> stackMax = stackElem

5 if (memory not available)

1 recycle (stackPtr)

2 stackPtr = null

6 else

Allocate memory for stack array

1 allocate (stackPtr -> stackAry)

3 return stackPtr

end createStack

อัลกอริทึมที่ 5.11 Create Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์pushstack (val stack <head pointer>, val data <dataType>)

Insert (push) one item into the stack.

Pre stack is a pointer to the stack head structure

data contains data to be pushed into stack

Post data have been pushed in stack

Return true if successful

false if memory overflow

1 if (stack -> count is at maximum)

1 success = false

2 else

1 stack -> count = stack -> count + 1

2 stack -> top = stack -> top + 1

3 stack -> stack&Ary[stack -> top] = data

4 success = true

3 return success

end pushstack

อัลกอริทึมที่ 5.12 Push Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithmอัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์ popStack (val stack <head pointer>, ref dataOut <dataType>)

This algorithm pops the item on the top of the stack and returns it to the user.

Pre stack is a pointer to the stack head structure

dataOut is a reference variable to receive the data

Post data have been returned to calling algorithm

Return true if successful

false if underflow

1 if (stack empty)

1 success = false

2 else

1 dataOut = stack -> staek&ry [stack -> top]

2 stack -> top = stack -> top - 1

3 stack -> count = stack -> count - 1

4 success = true

3 return success

end popStack

อัลกอริทึมที่ 5.13 Pop Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์stackTop (val stack <head pointer>,ref dataOut <dataType>)

This algorithm retrieves the data from the top of the

stack without changing the stack.

Pre stack is a pointer to the stack head structure

Post data have been returned to calling algorithm

Return true if data returned

false if underflow

1 if (stack -> count zero)

1 success = false

2 else

1 dataOut = stack -> stack&ry [stack -> top].data

2 success = true

3 return success

end stackTop

อัลกอริทึมที่ 5.14 Stack Top

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์emptyStack (val stack <head pointer>)

Determines if stack is empty and return a Boolean.

Pre stack is a pointer to the stack head structure

Post returns stack status

Return Boolean, true if stack empty

false if stack contains data

1 if (stack -> count > 0)

1 result = false

2 else

1 result = true

3 return result

end emptyStack

อัลกอริทึมที่ 5.15 Empty Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์fullStack (val stack <head pointer>)

Determines if stack is full and return a Boolean.

Pre stack is a pointer to the stack head structure

Post returns stack status

Return Boolean, true if stack full

false if memory available

1 if (stack -> count < MAX_STACK)

1 result = false

2 else

1 result = true

3 return result

end fullStack

อัลกอริทึมที่ 5.16 Full Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์stackCount (val stack <head pointer >)

Return the number of elements currently in stack.

Pre stack is a pointer to the stack head structure

Post returns stack count

Return integer count of number of elements in stack

1 return (stack -> count)

end stackCount

อัลกอริทึมที่ 5.17 Stack Count

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm destroyStack (val stack <typeStack>)อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์

This algorithm releases all nodes back to the dynamic memory.

Pre stack is a pointer to the stack head structure

Post head structure and array recycled

Return null pointer

1 If (stack not empty)

1 recycle (stack -> stackAry)

2 recycle (stack)

2 return null pointer

end destroyStack

อัลกอริทึมที่ 5.18 Destroy Stack

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Recursion
รีเคอร์ชัน (อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์Recursion)

รีเคอร์ชัน (Recursion) เป็นหลักการที่จะนำมาใช้กับการโปรแกรมแบบรีเคอร์ซีพ (Recursive) ซึ่งโดยปกติ สามารถเขียน อัลอริทึมได้ 2 รูปแบบด้วยกันคือ 1. การวนรอบ (Iteration) เป็นเทคนิคใช้หลักการวนรอบหรือลูป (Looping) เพื่อกระทำกระบวนการซ้ำๆ จนกระทั้งตรงตามเงื่อนไขการควบคุมลูปก็จะหลุดออกจากลูป 2. การเรียกตัวเอง (Recursion) เป็นเทคนิคการวนซ้ำเพื่อกระบวนการหรือชุดคำสั่งนั้นซ้ำๆ ด้วยวิธีการเรียกตัวเองเพื่อทำซ้ำ

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Factorial (n) = 1 (if n = 0)อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์

Factorial (n) = n X (n-1) X (n-2) X … X 3 X 2 X 1 {if n > 0}

  • Algorithm iterativeFactorial (n)

  • Calculates factorial of a number using a loop.

  • Pre n is the number to be raised factorially

  • Post n! Is returned

  • set i to 1

  • set facN to 1

  • 3 loop (i <= n)

  • 1 set facN to facN * 1

  • 2 increment i

  • 4 end loop

  • 5 return FactN

  • end iterativeFactorial

อัลกอริทึมที่ 5.19 Iterative Factorial Algorithm

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Factorial (3) = 3 X Factorial (2) อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์

Factorial (3) = 3 X 2 = 6

Factorial (2) = 2 X Factorial (1)

Factorial (2) = 2 X 1 = 2

Factorial (1) = 1 X Factorial (0)

Factorial (1) = 1 X 1 = 1

Factorial (0) = 1

อัลกอริทึมที่ 5.23 การคำนวณหา Factorial(3) ด้วยโปรแกรมรีเคอร์ซีพ

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Factorial (n) = 1 (if n = 0)อัลกอริทึมการสร้างสแต็กด้วยอาร์เรย์

Factorial (n) = n X (Factorial (n-1)) {if n > 0}

Algorithm recursiveFactorial (n)

Calculates factorial of a number using recursion.

Pre n is the number to be raised factorially

Post n! is returned

1 if {n equals 0}

1 return 1

2 else

1 return (n * recursiveFactorial (n - 1) )

3 end if

end recursiveFactorial

อัลกอริทึมที่ 5.20 Recursive Factorial Algorithm

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อัลกอริทึมที่ 5.24 การคำนวณหา Factorial(3) ด้วยโปรแกรมรีเคอร์ซีพที่เรียกตัวเองทำงาน

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


The End การคำนวณหา

Lesson 5

(Session 2)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201


ad