กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2...
Transcript of กองซ้อนและคิวinstructor.ru.ac.th/urai/cos2101/COS2101_11.pdf · 2.2...
กองซอ้นและคิวโดย ผศ.ดร.อุไร ทองหัวไผ่
กองซ้อนที่เช่ือมโยงกนั
กองซ้อน(Stack) เป็นโครงสร้างข้อมลูที่เป็นลกัษณะ LI-FO (Last In -First Out) โดยข้อมลูน าเข้าตวัสดุท้ายจะได้รับการบริการก่อน ข้อมลูน าเข้าตวัแรกจะได้รับการบริการเป็นล าดบัสดุท้าย ซึง่การน าเข้าและน าออกข้อมลูกระท าได้ที่ปลายด้านใดด้านหนึง่เทา่นัน้
C
B
A
A, B, C
C, B, A
การปฏิบติัการ-กรณีท่ีรายการโยงวา่งหรือไม่มีข้อมลู Top มีคา่เท่ากบั NULL
-การน าสมาชิกเข้าในรายการโยงจะกระท าท่ีปลายด้านใดด้านหนึง่
เรียกการปฏิบตัิการนีว้า่ push
-การน าสมาชิกออกจากรายการโยงจะกระท าท่ีปลายด้านเดียวกนั
เรียกการปฏิบตัิการนีว้า่ pop
-โดยตวัแปร Top จะชีท่ี้ต าแหน่งโหนดข้อมลูท่ีปฏิบตักิารเสมอ
ตอ้งการเกบ็นิพจน์ C + 2 + 3 – 5
5
-
3
2
C
+
Top
Top 5
-
3
2
+
C
การน าขอ้มูลออกจากรายการโยง
item = Top -> data;r = Top;Top = Top -> link;delete r;
Top 5
-
3
2
+
C
r
โปรแกรมตัดเกรด
#include<iostream>
#include<string>
using namespace std;
struct student
{
string name;
int score;
student* next;
};
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;
}
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;
}
}
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;
}
แถวคอยแถวคอย(Queued) เป็นโครงสร้างข้อมลูท่ีเป็นลกัษณะ FI-FO (First In - First Out)
โดยการปฏิบตัิงานกบัข้อมลูในโครงสร้างนีจ้ะกระท าท่ีปลาย 2 ด้าน
-โดยการน าสมาชิกเข้าไปเก็บในแถวคอยเรียกวา่การ insert โดยกระท าท่ีปลายด้านหนึ่ง
-การน าข้อมลูออกจากแถวคอยจะกระท าอีกปลายด้านหนึ่งเรียกวา่การ remove
โปรแกรมเมอร์สามารถก าหนดรายการโยงท่ีมีการท างานในลกัษณะแถวคอย
-โดยก าหนดตวัแปรช่ือ rear ชีอ้ยูท่ี่ข้อมลูโหนดตวัสดุท้ายของรายการโยง
-ตวัแปร front ชีท่ี้ข้อมลูโหนดแรกของรายการโยง
แถวคอย
48 5634frontrear
การ insert ขอ้มูลโปรแกรมเมอร์ต้องจองเนือ้ท่ีใหม ่1 โหนดส าหรับเก็บข้อมลู ในท่ีนีใ้ห้ตวัแปร p ชีท่ี้โหนดใหม่และน าข้อมลูไปเก็บในโหนดใหมไ่ด้ดงันี ้
p = new queueNode ;
p -> item = 78;
การเช่ือมโยงโหนดใหมไ่ปยงัแถวคอยจะกระท าการเช่ือมโยงของโหนดสดุท้ายไปชีท่ี้โหนดใหม ่และเปลี่ยนให้ตวัแปร rear ชีท่ี้โหนดใหมแ่ทน
rear -> next = p;
rear = p;
48
p
5634
78
frontrear
โปรแกรมการหาค่าเฉลีย่
#include<iostream>
#include<string>
using namespace std;
struct node
{
int score;
node *link;
};
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');
}
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;
}
int main()
{
node *front,*rear;
front = NULL;
rear = NULL;
enqueue(front,rear);
dequeue(front);
return 0;
}
การแปลง Infix เป็น Postfix
1.ใส ่( ) นิพจน์ตามล าดบัความส าคญัให้ครบ2.น า operator ไปแทนท่ีวงเลบ็ปิด ในแตล่ะล าดบั
ท่ีกระท าก่อนไปหลงั3.น าวงเลบ็เปิดออก
ตวัอยา่ง จงแปลง a + b * c ใหเ้ป็น postfixใสว่งเลบ็ตามล าดบัความส าคญัน าตวักระท าไปแทนวงเลบ็ปิดน าวงเลบ็เปิดออก
(a + (b * c) )
(a (b c* +
a b c * +
ตวัอยา่ง จงแปลง a * b + c * d ใหเ้ป็น postfix
ใสว่งเลบ็ตามล าดบัความส าคญั
น าตวักระท าไปแทนวงเลบ็ปิด
น าวงเลบ็เปิดออก
ตวัอยา่ง จงแปลง a * (b + c) / d ใหเ้ป็น postfix
ใสว่งเลบ็ตามล าดบัความส าคญัน าตวักระท าไปแทนวงเลบ็ปิดน าวงเลบ็เปิดออก
ตวัอยา่ง จงแปลง x-y^3*4 ใหเ้ป็น postfixใสว่งเลบ็ตามล าดบัความส าคญั
น าตวักระท าไปแทนวงเลบ็ปิด
น าวงเลบ็เปิดออก
ตวัอยา่ง การแปลง 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
ตวัอยา่ง จงแปลง 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*-
ตวัอยา่ง จงแปลง A* B + C * D - Eใหเ้ป็น postfix
token postfix stack
string
A
*
B
+
C
*
token postfix stack
string
D
-
E
ผลคือ
ตวัอยา่ง จงแปลง A* (B + C * D) - Eใหเ้ป็น postfix
token postfix stack
string
A
*
(
B
+
C
*
token postfix stack
string
D
)
-
E
ผลคือ
แบบฝึกหดั1.จงเขียนโปรแกรมแปลงนิพจน์ infix เป็นนิพจน์ postfix
2.จงหาผลลพัธ์ของนิพจน์ postfix
3.จงเขียนโปรแกรมแปลงนิพจน์ infix เป็นนิพจน์ prefix