PDA

View Full Version : کار با پشته و صف در ساختمان داده



mgmreza
دوشنبه 03 تیر 1387, 17:35 عصر
با سلام
من در ساختمان داده در نوشتن برنامه هايي مانند برنامه زير مشکل دارم :
برنامه اي که عددي را دريافت کرده و اگر زوج بود آن را در پشته قرار دهد و اگر فرد بود آن را در صف قرار دهد. من نميدانم که چگونه وقتي عدد زوج را به دست آوردم آن را در پشته قرار دهم. اگر در اين مورد برنامه اي داريد لينک دانلود آن را قرار دهيد و راهنمايي بفرماييد.
با تشکر

mgmreza
سه شنبه 04 تیر 1387, 02:56 صبح
با سلام
من در ساختمان داده در نوشتن برنامه هايي مانند برنامه زير مشکل دارم :
برنامه اي که عددي را دريافت کرده و اگر زوج بود آن را در پشته قرار دهد و اگر فرد بود آن را در صف قرار دهد. من نميدانم که چگونه وقتي عدد زوج را به دست آوردم آن را در پشته قرار دهم. اگر در اين مورد برنامه اي داريد لينک دانلود آن را قرار دهيد و راهنمايي بفرماييد.
با تشکر

سلام
لطفا به سوال فوق پاسخ دهید چون خیلی فوری است
با تشکر

mehdad.koulab
سه شنبه 04 تیر 1387, 13:12 عصر
سلام دوست عزیز این الگوریتم ذخیره در پشته


Procedure push (item)
Begin
If top <> n then
Begin
Top : = top + 1;
Stack [top] : = item;
End
Else
Write (‘stack is full’);
End;

اینم بازیابی از پشته


Procedure pop (var item)
Begin
If top <> 0 then
Begin
Item : = Stack [top];
Top : = top - 1;

End
Else
Write (‘stack is empity’);
End;

mehdad.koulab
سه شنبه 04 تیر 1387, 13:15 عصر
اینم الگوریتمهای مربوط به صف
ذخیره (اضافه کردن داده به صف)


Procedure addqueue (item)
Begin
If rear = n then //شرط بررسی پر بودن صف
Write ( ‘Queue is full’ ) //پیغام پر بودن صف
Else
Begin
Rear : = rear + 1;
Queue[rear] : = item ;
end ;
End ;

اینم بازیابی یا همون حذف


Procedure delete Queue (var item)
Begin
If front = rear then //شرط بررسی خالی بودن صف
Write (‘Queue is Empty’);پیغام خالی بودن صف
Else
Begin
Front : = front+1 ;
Item : = Queue[front] ;
end ;
End ;

البته اینا برای صف خطی بود حلقوی رو تو پست بعدی می ذارم

mehdad.koulab
سه شنبه 04 تیر 1387, 13:18 عصر
اینم صف حلقوی
اضافه کردن عنصر



Procedure add circular queue (item)
Begin
Rear : = ( rear + 1 ) mod n ;
If rear = front then
Wrtite (‘Queue is full’) ;
Else
q [ rear ] : = item ;
end ;

اینم حذف عنصر


Procedure delete circular Queue ( var item )
Begin
If front = rear then
Write ( ‘ Queue is empty ’ ) ;
Else
Begin
Front : = ( front + 1 ) mod n ;
Item : = q [ front ] ;
End ;
End ;

Dadai ahmad
چهارشنبه 05 تیر 1387, 19:20 عصر
میشه الگوریتم pop,pudh پشته های دو پیوندی هم بذارین؟
خیلی ممنون

mehdad.koulab
شنبه 15 تیر 1387, 16:16 عصر
میشه الگوریتم pop,pudh پشته های دو پیوندی هم بذارین؟
خیلی ممنون
سلام دوست عزیز اگه منظورتون لیستهای پیوندی دو طرفه باشه بگین بذارم وگرنه من پشته دو پیوندی رو بلد نیستم.

morycom
سه شنبه 10 مرداد 1391, 08:14 صبح
سلام دوست عزیز اگه منظورتون لیستهای پیوندی دو طرفه باشه بگین بذارم وگرنه من پشته دو پیوندی رو بلد نیستم.

دوست عزيز كدي كه در بالا براي اضافه به صف حلقوي نوشتيد اشتباه هست
چون دو مشكل داره
1- rear هميشه بايد به اخرين عنصر صف اشاره كنه ولي در اين برنامه وقتي صف پر بشه به يك مكان خالي اشاره ميكنه
2- باز هم شرط پر و خالي بودن صفها يكي هستند (سعي كنيد يه بار آرايه را پر كنيد اگر ما صفي از 0 ت 5 داشته باشيم
و وضعيت فعلي rear=5 و front = 0 باشه و بخواهيم يك عنصر ديگر به ته صف اضافه كنيم آنوقت داريم:
rear=(rear+1)%6 در اين صورت rear =0 خواهد شد و front=0 نيز مساوي صفر است
همانطور كه ميبيني در عين حال كه صف خالي است همزمان صف پر نيز ميباشد
براي تصحيح اين اشتباه بايد شرط موجود در قسمت add را به صورت زير تغيير دهيد
void addq(items k)

{

if (front==(rear+1)%n)

queufull();

else {

rear=(rear+1)%n;

q[rear]=k;

}
موفق باشيد:خجالت::چشمک: