กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/cos2101_11.pdf · 2.2...

26
กองซ้อนและคิว โดย ผศ.ดร.อุไร ทองหัวไผ่

Upload: others

Post on 01-May-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

กองซอ้นและคิวโดย ผศ.ดร.อุไร ทองหัวไผ่

Page 2: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

กองซ้อนที่เช่ือมโยงกนั

กองซ้อน(Stack) เป็นโครงสร้างข้อมลูที่เป็นลกัษณะ LI-FO (Last In -First Out) โดยข้อมลูน าเข้าตวัสดุท้ายจะได้รับการบริการก่อน ข้อมลูน าเข้าตวัแรกจะได้รับการบริการเป็นล าดบัสดุท้าย ซึง่การน าเข้าและน าออกข้อมลูกระท าได้ที่ปลายด้านใดด้านหนึง่เทา่นัน้

C

B

A

A, B, C

C, B, A

Page 3: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

การปฏิบติัการ-กรณีท่ีรายการโยงวา่งหรือไม่มีข้อมลู Top มีคา่เท่ากบั NULL

-การน าสมาชิกเข้าในรายการโยงจะกระท าท่ีปลายด้านใดด้านหนึง่

เรียกการปฏิบตัิการนีว้า่ push

-การน าสมาชิกออกจากรายการโยงจะกระท าท่ีปลายด้านเดียวกนั

เรียกการปฏิบตัิการนีว้า่ pop

-โดยตวัแปร Top จะชีท่ี้ต าแหน่งโหนดข้อมลูท่ีปฏิบตักิารเสมอ

Page 4: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตอ้งการเกบ็นิพจน์ C + 2 + 3 – 5

5

-

3

2

C

+

Top

Top 5

-

3

2

+

C

Page 5: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

การน าขอ้มูลออกจากรายการโยง

item = Top -> data;r = Top;Top = Top -> link;delete r;

Top 5

-

3

2

+

C

r

Page 6: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

โปรแกรมตัดเกรด

#include<iostream>

#include<string>

using namespace std;

struct student

{

string name;

int score;

student* next;

};

Page 7: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

void print(student* p)

{

int f=0;int P=0;

int g=0;

while (p != NULL)

{

cout<<p->name<<" "<<p->score<<endl;

if (p->score<60) f++;

else if (p->score<80) P++;

else g++;

p=p->next; //

}

cout<<"G= "<<g<<" P= "<<P<<" F= "<<f<<endl;

}

Page 8: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

void push(student*& top) //

{

student * p;

p = new student; //

cout<<"name="; cin>>p->name;

cout<<"score="; cin>>p->score;

p->next = NULL;

if (top==NULL)

top=p;

else

{

p->next=top;

top = p;

}

}

Page 9: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

int main()

{

char ch;

student *top ;

top = NULL;

do {

push(top);

cout<<"run again y/n?";cin>>ch;

}while (ch != 'n');

print(top);

return 0;

}

Page 10: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

แถวคอยแถวคอย(Queued) เป็นโครงสร้างข้อมลูท่ีเป็นลกัษณะ FI-FO (First In - First Out)

โดยการปฏิบตัิงานกบัข้อมลูในโครงสร้างนีจ้ะกระท าท่ีปลาย 2 ด้าน

-โดยการน าสมาชิกเข้าไปเก็บในแถวคอยเรียกวา่การ insert โดยกระท าท่ีปลายด้านหนึ่ง

-การน าข้อมลูออกจากแถวคอยจะกระท าอีกปลายด้านหนึ่งเรียกวา่การ remove

โปรแกรมเมอร์สามารถก าหนดรายการโยงท่ีมีการท างานในลกัษณะแถวคอย

-โดยก าหนดตวัแปรช่ือ rear ชีอ้ยูท่ี่ข้อมลูโหนดตวัสดุท้ายของรายการโยง

-ตวัแปร front ชีท่ี้ข้อมลูโหนดแรกของรายการโยง

Page 11: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

แถวคอย

48 5634frontrear

Page 12: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

การ insert ขอ้มูลโปรแกรมเมอร์ต้องจองเนือ้ท่ีใหม ่1 โหนดส าหรับเก็บข้อมลู ในท่ีนีใ้ห้ตวัแปร p ชีท่ี้โหนดใหม่และน าข้อมลูไปเก็บในโหนดใหมไ่ด้ดงันี ้

p = new queueNode ;

p -> item = 78;

การเช่ือมโยงโหนดใหมไ่ปยงัแถวคอยจะกระท าการเช่ือมโยงของโหนดสดุท้ายไปชีท่ี้โหนดใหม ่และเปลี่ยนให้ตวัแปร rear ชีท่ี้โหนดใหมแ่ทน

rear -> next = p;

rear = p;

48

p

5634

78

frontrear

Page 13: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

โปรแกรมการหาค่าเฉลีย่

#include<iostream>

#include<string>

using namespace std;

struct node

{

int score;

node *link;

};

Page 14: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

void enqueue(node*& front, node*& rear)

{

char ch; node *p;

do

{

p = new node;

cout<<"score=";

cin>>p->score;

p->link = NULL;

if (rear==NULL)

{

front = p;

rear = p;

}

else

{

rear->link = p;

rear = p;

}

cout<<"run again y/n?";

cin>>ch;

} while (ch=='y');

}

Page 15: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

void dequeue(node*& front)

{

node* p;

double sum=0.0 , size=0;

double average;

while (front != NULL)

{

cout<<front->score<<" ";

sum = sum + front->score;

size++;

p = front;

front=front->link;

delete(p);

}

average = sum/size;

cout<<endl<<"Average= "<<average<<endl;

cout<<endl;

}

Page 16: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

int main()

{

node *front,*rear;

front = NULL;

rear = NULL;

enqueue(front,rear);

dequeue(front);

return 0;

}

Page 17: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

การแปลง Infix เป็น Postfix

1.ใส ่( ) นิพจน์ตามล าดบัความส าคญัให้ครบ2.น า operator ไปแทนท่ีวงเลบ็ปิด ในแตล่ะล าดบั

ท่ีกระท าก่อนไปหลงั3.น าวงเลบ็เปิดออก

Page 18: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตวัอยา่ง จงแปลง a + b * c ใหเ้ป็น postfixใสว่งเลบ็ตามล าดบัความส าคญัน าตวักระท าไปแทนวงเลบ็ปิดน าวงเลบ็เปิดออก

(a + (b * c) )

(a (b c* +

a b c * +

Page 19: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตวัอยา่ง จงแปลง a * b + c * d ใหเ้ป็น postfix

ใสว่งเลบ็ตามล าดบัความส าคญั

น าตวักระท าไปแทนวงเลบ็ปิด

น าวงเลบ็เปิดออก

Page 20: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตวัอยา่ง จงแปลง a * (b + c) / d ใหเ้ป็น postfix

ใสว่งเลบ็ตามล าดบัความส าคญัน าตวักระท าไปแทนวงเลบ็ปิดน าวงเลบ็เปิดออก

Page 21: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตวัอยา่ง จงแปลง x-y^3*4 ใหเ้ป็น postfixใสว่งเลบ็ตามล าดบัความส าคญั

น าตวักระท าไปแทนวงเลบ็ปิด

น าวงเลบ็เปิดออก

Page 22: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตวัอยา่ง การแปลง infix ใหเ้ป็น postfix โดยวธีิ Stack

1. อ่านตวัอกัษร 1 ตวั(token)

2. ถ้าเป็น operand ให้ ไปเช่ือมต่อที่ output string

ถ้าเป็น operator ให้กระท าดงันี ้

2.1 ถ้า stack ว่าง หรือ

ICP> ISP หรือ

หรือเป็น ( ให้ push

2.2 ถ้า ICP<=ISP ให้

pop ออกมาเช่ือมต่อที่

output string จนกวา่

จะเข้าเง่ือนไขในข้อ 2.1

2.3 ถ้าเป็น ) ให้ pop จนพบ วงเลบ็เปิดคูข่องกนั

3. ท าซ า้ในข้อ 1-3 จนกวา่หมดข้อมลู

4. Pop ข้อมลูมาเช่ือมต่อกบั output string

Page 23: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตวัอยา่ง จงแปลง A+ B * C – D * Eใหเ้ป็น postfix

token postfix stack

string

A A วา่ง

+ A +

B AB +

* AB +*

C ABC +*

- ABC*+ -

token postfix stack

string

D ABC*+D -

* ABC*+D -*

E ABC*+DE -*

Pop ออกมา ผลที่ได้คือ

ABC*+DE*-

Page 24: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตวัอยา่ง จงแปลง A* B + C * D - Eใหเ้ป็น postfix

token postfix stack

string

A

*

B

+

C

*

token postfix stack

string

D

-

E

ผลคือ

Page 25: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

ตวัอยา่ง จงแปลง A* (B + C * D) - Eใหเ้ป็น postfix

token postfix stack

string

A

*

(

B

+

C

*

token postfix stack

string

D

)

-

E

ผลคือ

Page 26: กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2 ถ้า ICP

แบบฝึกหดั1.จงเขียนโปรแกรมแปลงนิพจน์ infix เป็นนิพจน์ postfix

2.จงหาผลลพัธ์ของนิพจน์ postfix

3.จงเขียนโปรแกรมแปลงนิพจน์ infix เป็นนิพจน์ prefix