اسلایدهای جلسه ششم (صف و پشته) – ۳۰ آبان ۹۲

Download Report

Transcript اسلایدهای جلسه ششم (صف و پشته) – ۳۰ آبان ۹۲

‫‪ ‬صف (‪ )Queue‬یک لیست خطی از عناصر است که در آن عمل حذف‬
‫تنها میتواند از یک انتهای آن موسوم به ابتدای صف (‪ )Front‬و عمل‬
‫اضافه شدن تنها میتواند از انتهای دیگر آن به نام انتهای صف (‪)Rear‬‬
‫انجام گیرد‪.‬‬
‫‪ ‬اولین ورودی اولین خروجی (‪)First In First Out( )FIFO‬‬
‫‪ ‬ترتیبی که عنصرها وارد صف میشوند همان ترتیبی است که از آن خارج‬
‫میشوند‪.‬‬
‫‪ ‬صفهای نانوایی و صف بانک مثالهای روزمره از صف هستند‪.‬‬
‫‪ ‬صف پردازشهای سیستم عامل مثالی از کاربرد صف در رایانه است‪.‬‬
‫‪2‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
‫‪ ‬برای نمایش صف معمول از لیست یکطرفه یا آرایه خطی استفاده‬
‫میشود‪.‬‬
‫‪ ‬هر صف توسط عناصر زیر پیاده سازی می شود‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫آرایه خطی ‪Queue‬‬
‫متغیر اشارهگر ‪ :Front‬یک واحد کمتر از مکان عنصر ابتدای صف‬
‫متغیر اشارهگر ‪ :Rear‬مکان عنصر انتهای صف‬
‫‪3‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬








Front: -1
Rear: 3
Front: 0
Rear: 3
Front: 0
Rear: 5
Front: 1
Rear: 5
‫صف و پشته‬
A
B
C
D
…
0
1
2
3
…
B
C
D
…
1
2
3
…
B
C
D
E
F
…
1
2
3
4
5
…
C
D
E
F
…
2
3
4
5
…
0
0
0
1
n-1
n-1
n-1
n-1
4
92/08/30 ،‫جلسه ششم‬
‫‪‬‬
‫انتخاب آرایه ]‪ Q[n‬برای پیاده سازی صف خطی دارای شرایط اولیه و مرزی‬
‫زیر است‪:‬‬
‫‪Front = Rear = -1‬‬
‫‪ ‬وضعیت اولیه صف‪:‬‬
‫‪Front = Rear‬‬
‫‪ ‬خالی بودن صف خطی‪:‬‬
‫‪Rear = n-1‬‬
‫‪ ‬پر بودن صف خطی‪:‬‬
‫(هرچند ممکن است ابتدای صف خالی باشد اما قابل استفاده نیست‪).‬‬
‫‪5‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
‫‪ ‬درج در صف‪:‬‬
‫‪ ‬برای درج‪ ،‬در صورت پر نبودن صف‪ ،‬چون ‪ Rear‬به خانه آخر صف‬
‫اشاره میکند‪ ،‬ابتدا ‪ Rear‬یک واحد اضافه شده (به جلو حرکت کرده)‬
‫سپس داده مورد نظر در خانه انتهای صف درج می شود‪.‬‬
‫‪ ‬حذف از صف‪:‬‬
‫‪ ‬برای حذف‪ ،‬در صورت خالی نبودن صف‪ ،‬چون ‪ Front‬همیشه به‬
‫خانه قبل از اول صف اشاره می کند‪ ،‬ابتدا ‪ Front‬یک واحد اضافه‬
‫شده (به جلو حرکت کرده) سپس داده ابتدای صف خارج شده و در‬
‫متغیر مورد نظر قرار می گیرد‪.‬‬
‫‪6‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
.‫ درج کنید‬Q[n] ‫ را در صف‬x ‫ عنصر‬
void add (int x){
If (rear==n-1) write “Queue is full”
Else {
rear++
Q[rear] = x
}
}
‫صف و پشته‬
O(1)
7
92/08/30 ،‫جلسه ششم‬
.‫ را حذف کنید‬Q[n] ‫ عنصر اول صف‬
int delete(){
If (front==rear){
write “Queue is empty”
return 0
}
Else {
front++
y = Q[front]
return y
}
}
‫صف و پشته‬
O(1)
92/08/30 ،‫جلسه ششم‬
8
‫‪ ‬مشکل‪:‬‬
‫‪‬‬
‫حرکت تدریجی عناصر به سمت انتهای صف و عدم امکان استفاده از‬
‫خانه های ابتدای صف که در اثر حذف خالی شده اند‪ ،‬مشکل صف‬
‫های خطی است‪.‬‬
‫‪ ‬راه حل‪:‬‬
‫‪9‬‬
‫‪ .1‬شیفت خانه های انتهای صف به سمت ابتدای صف که این عمل در‬
‫صورتی که تعداد خانه های صف زیاد باشد هزینه بالیی خواهد‬
‫داشت‪.‬‬
‫‪ .2‬استفاده از صف حلقوی به این مفهوم که زمانی که به انتهای صف‬
‫رسیدیم‪ ،‬عمل درج را دوباره از ابتدای صف انجام می دهیم و این‬
‫حرکت چرخش ی می باشد‪.‬‬
‫‪ ‬روش دوم در عمل مقرون به صرفه تر بوده و استفاده می شود‪.‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
‫‪ ‬آرایه ‪ n‬تایی ]‪ Q[n‬را می توان به صورت یک صف حلقوی در نظر گرفت به‬
‫طوری که در این صف زمانی که ‪ Rear = n-1‬شد‪ ،‬عنصر بعدی در خانه ‪0‬‬
‫قرار می گیرد‪.‬‬
‫‪ ‬حرکت در خالف جهت حرکت عقربه های ساعت است‪.‬‬
‫‪ ‬باز هم ‪ Front‬به یک مکان قبل از عنصر اول اشاره دارد‪.‬‬
‫‪ ‬مثال‪ :‬درج عنصر ‪ 50‬در صف حلقوی مقابل؟‬
‫‪10‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
‫‪ ‬انتخاب آرایه ]‪ Q[n‬برای پیاده سازی صف حلقوی دارای شرایط اولیه و مرزی‬
‫زیر است‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫وضعیت اولیه صف‪Front = Rear = -1 :‬‬
‫خالی بودن صف حلقوی‪Front = Rear :‬‬
‫پر بودن صف حلقوی‪(Rear + 1) mod n = Front :‬‬
‫‪ ‬در هر صف حلقوی ‪ n‬عضوی همیشه یک خانه خالی وجود دارد و حداکثر از ‪n-‬‬
‫‪ 1‬خانه صف می توانیم استفاده کنیم‪ .‬این به آن علت است که بتوانیم‬
‫وضعیت پر یا خالی بودن صف حلقوی را تشخیص بدهیم‪.‬‬
‫‪11‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
.‫ درج کنید‬Q[n] ‫ را در صف‬x ‫ عنصر‬
k = (rear+1) % n
If (front == k) write “Queue is full”
Else {
rear=k
Q[rear] = x
}
O(1)
‫صف و پشته‬
12
92/08/30 ،‫جلسه ششم‬
.‫ را حذف کنید‬Q[n] ‫ عنصر اول صف‬
If (front==rear){
write “Queue is empty”
}
Else {
front = (front+1) % n
y = Q[front]
}
‫صف و پشته‬
O(1)
13
92/08/30 ،‫جلسه ششم‬
‫‪ ‬درج و حذف از صف های حلقوی مقابل؟‬
‫‪14‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
‫‪ ‬پشته (‪ )stack‬یک ساختمان داده خطی از عناصر است که در آن عمل‬
‫حذف و اضافه عناصر تنها میتواند از یک انتهای آن موسوم به بالی‬
‫پشته (‪ )top‬انجام گیرد‪.‬‬
‫‪ ‬آخرین ورودی اولین خروجی (‪)Last In First Out( )LIFO‬‬
‫‪ ‬ترتیبی که عنصرها از پشته خارج میشوند برعکس ترتیبی است که وارد‬
‫آن میشوند‪.‬‬
‫‪ ‬پشته بشقابها مثالی از پشته است‪.‬‬
‫‪15‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
‫‪ ‬برای اضافه کردن عنصر در پشته از اصطالح ‪ push‬و برای حذف یک‬
‫عنصر در پشته از اصطالح ‪ pop‬استفاده میگردد‪.‬‬
‫‪ ‬هر پشته توسط عناصر زیر پیاده سازی می شود‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫آرایه خطی ‪Stack‬‬
‫متغیر اشارهگر ‪ :Top‬مکان عنصر بالی پشته‬
‫متغیر ‪ :MAXSTK‬بیشترین تعداد عنصر قابل نگهداری توسط پشته مثال در‬
‫یک آرایه ‪ n‬خانه ای ‪ n‬عنصر میتواند وجود داشته باشد‪.‬‬
‫‪16‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫صف و پشته‬
‫‪ ‬پشته را میتوان به صورتهای زیر نمایش داد‪ .‬اما معمول به کمک آرایه‬
‫نمایش داده می شود‪.‬‬
‫‪ S: A, E, C, H‬‬
‫‪n‬‬
‫‪...‬‬
‫‪H‬‬
‫‪C‬‬
‫‪E‬‬
‫‪A‬‬
‫‪...‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪top‬‬
‫‪top‬‬
‫‪17‬‬
‫جلسه ششم‪92/08/30 ،‬‬
‫‪3‬‬
‫‪H‬‬
‫‪2‬‬
‫‪C‬‬
‫‪1‬‬
‫‪E‬‬
‫‪0‬‬
‫‪A‬‬
‫صف و پشته‬
.‫ درج کنید‬S[Maxstk] ‫ را در پشته‬x ‫ عنصر‬
If (top==Maxstk-1) write “Stack is full”
Else {
top++
S[top] = x
}
O(1)
‫صف و پشته‬
18
92/08/30 ،‫جلسه ششم‬
.‫ را حذف کنید‬S[Maxstk] ‫ عنصر بالیی پشته‬
If (top==-1){
write “Stack is empty”
}
Else {
y = Q[top]
top-}
‫صف و پشته‬
O(1)
19
92/08/30 ،‫جلسه ششم‬