‫بسم الله الرحمن الرحيم‬

‫الخوارزميات‬
‫تحليل الخوارزميات‪:‬‬
‫‪ -1‬الغرض هو الحصول على برنامج ذات كفاءة عالية ويمكن الحصول‬
‫على البرنامج ذات الكفاءة العالية بطريقتين‪-:‬‬
‫أ‪ /‬تقليل زمن تنفيذ البرنامج ‪.‬‬
‫ب‪ /‬تقليل المساحة المستخدمة من الذاكرة ‪.‬‬
‫قياس الزمن‪-:‬‬
‫أ ‪ oh notation /‬ونعبر عنه مثل ً ‪. (O(N‬‬
‫ب‪ /‬اللوغريثم ونعبر عنه مثل ً ‪. log 2‬‬
‫يمكن قياس زمن البرنامج بـ ‪ (O(N‬وذلك بمعرفة عدد تكرارات‬
‫العبارات داخل البرنامج ‪.‬‬
‫وعند قياس كفاءة البرنامج بواسطة زمن التنفيذ يجب إهمال جانب‬
‫المساحة المستخدمة في الذاكرة أي ل تعطي اعتبارا ً للمساحة عند‬
‫قياس الكفاءة بالزمن ‪:‬‬
‫قاعدة ‪-:‬‬
‫‪((O(N1) + O(N2) = O(MAX(N1,N2‬‬
‫إذا كان ‪. N1>>N2‬‬
‫مثال ‪ :‬أحسب ‪ oh notation‬للبرنامج التالي ‪:‬‬
‫‪For i :=1 to N do‬‬
‫‪; (Read (x‬‬
‫فإن زمن تنفيذ هذا الجزء من البرنامج هو ‪. (O(N‬‬
‫مثال ‪ :‬أحسب زمن تنفيذ البرنامج التالي ‪:‬‬
‫‪For i:= 1 to n do‬‬
‫‪For j :=1 to n do‬‬
‫‪; (Read (x‬‬
‫فإن زمن تنفيذ البرنامج هو ‪. (O(N2‬‬
‫مثال ‪:‬‬
‫‪For i:= 1 to n do‬‬
‫‪; (Read(x‬‬
‫‪; (Read(y‬‬
‫فإن زمن البرنامج هو ‪. (O(N)+O(1‬‬
‫وحسب القاعدة إذا كانت ‪ N2>>N1‬فإنه نأخذ الكبر فقط فنقول أن‬
‫زمن تنفيذ البرنامج هو ‪. (O(N‬‬
‫تمرين ‪:‬‬
‫أحسب ‪ oh notation‬للعبارات التالية ‪:‬‬
‫; ‪sum = 0‬‬
‫‪/1‬‬
‫‪for I := 1 to n do‬‬
‫‪;sum := sum + 1‬‬
‫‪1‬‬

k := n * n ;
/2
for I := 1 to n do
for j :=1 to k do
sum := sum + 1 ;
for i:= 1 to n do
/3
for j := 1 to I do
;sum := sum + 1
‫مثال لتحسين الكفاءة بمعيار الزمن‬
‫خوارزمية الس‬
N
N/2
N/2
X =X .X
‫ عدد زوجي فان‬N ‫إذا كان‬
N
N-1/2
N-1/2
X =X
.X
.X
‫ عدد فردي فان‬N ‫إذا كان‬
N
‫ مرة مستخدما ً الحلقات ومرة‬X ‫ أكتب برنامج يحسب‬: ‫مثال‬
‫ في كل‬oh notation ‫أخرى مستخدما ً خوارزمية الس وأحسب‬
‫مرة ؟‬
; Function power(x,n:integer ):real
Var
; Sum:real
; I : integer
Begin
; Sum:= 0
For I := 1 to n do
; sum := sum × x
; power := sum
; end
: ‫باستخدام خوارزمية الس‬
Function power(x,n:integer):real;
Begin
If n = 0 then power :=1
Else
If odd (n) then
((Power := x * sqr(power (x,n div 2
Else
; ((Power :=sqr (power (x,n div 2
; End

2

‫تحليل المثالين السابقين إذا تم حساب ‪ X62‬فإن زمن تنفيذ‬
‫البرنامج الول ‪ (O(62‬بينما يتم تنفيذ البرنامج بخوارزمية الس في‬
‫خمسة خطوات فقط ‪-:‬‬
‫‪X62 = X31 . X31‬‬
‫‪X31 = X15 . X15 . X‬‬
‫‪X15 = X7 . X7 . X‬‬
‫‪X7 = X3 . X3 . X‬‬
‫‪X3 = X2 . X‬‬
‫إذن زمن تنفيذ البرنامج ‪X62‬بخوارزمية الس تساوي ‪. (O(5‬‬

‫نستخدم اللوغريثم أيضا ً في قياس زمن تنفيذ البرنامج فمثل ً في‬
‫خوارزميات الترتيب المختلفة ) الفقاع ‪ ،‬الدخال ‪ ،‬البدال ‪ .… ،‬الخ‬
‫( فإن هذه الخوارزميات تختلف من ناحية الكفاءة مع أنها تتفق‬
‫جميعها في هدفها الرئيسي وهي ترتيب العناصر تصاعديا ً أم‬
‫تنازليا ً ‪.‬‬
‫فنقيس أزمنة خوارزميات الترتيب باللوغريثم وكذلك البحث يقاس‬
‫باللوغريثم ‪.‬‬

‫المكدسات ‪STACKS‬‬

‫تعريف المكدسة ‪-:‬‬
‫المكدسة هي قائمة من البيانات تحفظ بطريقة خطية يتم فيها‬
‫حذف وإضافة البيانات من طرف واحد يسمى القمة )‪. (TOP‬‬
‫ويطلق على هذا النوع من البيانات ‪ LIFO‬اختصار لـ ‪LAST IN‬‬
‫‪ ، FIRST OUT‬الداخل أخيرا ً هو الخارج أول ً ‪.‬‬
‫مثال للمكدسة في الحياة العملية ترتيب المتعة داخل الحقيبة‬
‫حيث يكون آخر ما نضعه في الحقيبة عند ملئها هو أول ما يخرج‬
‫منها عند تفريغها ‪.‬‬
‫عمليات المكدسة ‪-:‬‬
‫عملية إضافة عنصر للمكدسة ‪ .‬وتتم بواسطة البرنامج‬
‫‪-1‬‬
‫الفرعي ‪. PUSH‬‬
‫وعملية الضافة تحتاج إلى دالة مساعدة وهي الدالة ‪ FULL‬حيث‬
‫وظيفتها اختبار إذا كانت المكدسة ممتلئة أم ل ‪ ،‬لنه في حالة‬
‫المتلء ل يمكن إضافة عنصر جديد لن ذلك يؤدي إلى مشكلة‬
‫الفيضان ‪. STACK OVER FLOW‬‬
‫‪3‬‬

‬‬ ‫‬‫نوع الوسيط ‪ VALUE PARAMETER‬لنها دالة اختبار‬ ‫‬‫فقط ‪.S : STACK‬‬ ‫الدالة ‪-: EMPTY‬‬ ‫هي دالة اختبار للمكدسة هل هي خالية أم ل ‪..MAXSTACK‬‬ ‫‪.‬وتتم بواسطة البرنامج‬ ‫الفرعي ‪. MAXSTACK = 100‬‬ ‫‪TYPE‬‬ ‫‪STACK = RECORD‬‬ ‫‪.top = 0 then‬‬ ‫‪Empty := true‬‬ ‫‪Else‬‬ ‫. END‬‬ ‫‪VAR‬‬ ‫‪.‬‬ ‫‪ -2‬تستخدم السجلت لربط المصفوفة وقمة المكدسة ‪. TOP : 0. ‪Empty := false‬‬ ‫‪4‬‬ ..‬‬ ‫‬‫وترجع الدالة ‪ EMPTY‬قيمة ‪ TRUE‬إذا كانت المكدسة خالية و‬ ‫‪ FALSE‬إذا كانت غير ذلك ‪.‬‬ ‫تنكمش وتتمدد المكدسة أثناء تنفيذ عملية الضافة والحذف وأكبر‬ ‫مدى تصل إلية المكدسة هو المدى المحدد سلفا ً للمكدسة‬ ‫‪ MAXSTACK‬وأقل مدى تصل إلية هو قاع المكدسة‬ ‫‪ ، BOTTOMMOST‬ويحدد الموقع الحالي لقمة المكدسة باستخدام‬ ‫الـ ‪.‫‪-2‬عملية حذف عنصر من المكدسة ‪ .‬‬ ‫الوسائط هي المكدسة فقط ‪.‬لنه ل يمكن‬ ‫حذف عنصر من مكدسة فارغة و إل حدثت ‪STACK UNDER‬‬ ‫‪.‬‬ ‫‬‫وتكون المكدسة خالية إذا كانت القمة تساوي الصفر ‪.MAXSTACK] OF INTEGER‬‬ ‫‪.‬‬ ‫كتابة الدالة ‪-:‬‬ ‫. ‪Function empty (s:stack):boolean‬‬ ‫‪Begin‬‬ ‫‪If s. ITEM : ARRAY [1. TOP‬‬ ‫تعريف المكدسات ‪-:‬‬ ‫‪CONST‬‬ ‫‪. POP‬‬ ‫وعملية الحذف تحتاج إلى دالة مساعدة وهي الدالة ‪ EMPTY‬حيث‬ ‫وظيفتها اختبار إذا ما كانت المكدسة فارغة أم ل ‪ . FLOW‬‬ ‫بناء المكدسات ‪-:‬‬ ‫‪ -1‬تستعمل المصفوفات كمنازل لحتواء عناصر المكدسة ‪.

‬‬ ‫. ‪Uses stack‬‬ ‫‪Begin‬‬ ‫‪5‬‬ .‬‬ ‫‬‫وتكون المكدسة ممتلئة إذا كانت القمة تساوي الـ‬ ‫‬‫‪.‬‬ ‫.‪End‬‬ ‫ويتم اختبار الدالة كالتي ‪-:‬‬ ‫.item [s.‪End‬‬ ‫ويتم اختبار الدالة كالتي ‪-:‬‬ ‫. ‪End‬‬ ‫مثال ‪-:‬‬ ‫أكتب برنامج يقوم بتحويل عدد من النظام العشري إلى ما يناظره‬ ‫من النظام السداسي عشري ؟‬ ‫الحل‬ ‫نستخدم الوحدة ‪ stack‬التي تحتوي على كل البرامج الفرعية‬ ‫الخاصة بالمكدسة ‪.‬‬ ‫.‬‬ ‫‬‫نوع الوسيط ‪ VALUE PARAMETER‬لنها دالة اختبار‬ ‫‬‫فقط ‪. ‪Full := false‬‬ ‫. ‪Function stacktop (s:stack ) : integer‬‬ ‫‪Begin‬‬ ‫)'‪If empty (s) then write ('stack is empty‬‬ ‫‪Else‬‬ ‫. )'‪If empty (s) then write('stack is empty‬‬ ‫الدالة ‪-: Full‬‬ ‫هي دالة اختبار للمكدسة ممتلئة أم ل ‪.‫. )'‪If full (s) then write ('stack is full‬‬ ‫الدالة ‪stacktop‬‬ ‫تقوم بطباعة القيمة الموجودة في قمة المكدسة ‪.top‬‬ ‫.‬‬ ‫الوسائط الـ ‪ PARAMETER‬هي المكدسة فقط ‪.top = maxstack then‬‬ ‫‪Full := true‬‬ ‫‪Else‬‬ ‫. ]‪Stacktop := s. MAXSTACK‬‬ ‫وترجع الدالة ‪ FULL‬قيمة ‪ TRUE‬إذا كانت المكدسة‬ ‫‬‫ممتلئة و ‪ FALSE‬إذا كانت غير ذلك ‪. ‪Function full (s:stack):boolean‬‬ ‫‪Begin‬‬ ‫‪If s.

Read(n) . Push (s. 13 : write ('D') .op1+op2 ) : ‫ هي‬S ‫إذا كانت المكدسة‬ : ‫ تعطي بالمكدسة‬addtop ‫فإن نداء الجراء‬ 6 . Writeln(' your number in hex-decimal is ') . 11 : write ('B') . else write (pop(s)) . 14 : write ('E') . Until n = 0 . N := n div 16 .Writeln(' input your decimal number ') . While not empty (s) do Begin Case pop(s) of 10 : write ('A') . end . end . 12 : write ('C') .op2) Else Op1 = pop (s) Element = false Push ( s. end . readln . Repeat X := N mod 16 .x) . 15 : write ('F') . addtop ‫الجراء‬ . ‫وظيفة هذا الجراء هو جمع أعلى عنصرين في المكدسة‬ -: ‫الخوارزمية‬ Op2 = pop(s) If empty(s) then Element = true Push( s.

‬‬ ‫تطبيقات على المكدسة )التطبيق الول (‬ ‫‪-1‬إيجاد قيمة معادلة مكتوبة بالـ ‪.‬‬ ‫‪. Postfix Notation‬‬ ‫خوارزمية حساب قيمة معادلة مكتوبة بطريقة ‪-: Postfix Notation‬‬ ‫‪ -1‬أضف قوس يميني ) للمعادلة ‪. S‬‬ ‫‪ -4‬إذا كان العنصر رمز حسابي ) ‪ ( +‬نفذ من أ إلى د ‪-:‬‬ ‫أ ‪ /‬أحذف العنصرين العلويين في المكدسة ‪ S‬و ضعهما في‬ ‫المتغير ‪ OP1‬و ‪. ‪Addtop‬‬ ‫. posfix notation‬‬ ‫‪-: Postfix notation‬‬ ‫تعتبر واحدة من طريق كتابة التعابير الرياضية ‪.‬‬ ‫الخوارزمية ‪-:‬‬ ‫‪Repeat‬‬ ‫. OP1 ( + ) OP2‬‬ ‫ج‪ /‬أضف نتيجة الخطوة ) ب ( إلى قمة المكدسة ‪. p‬‬ ‫‪ -2‬عالج عناصر المعادلة ‪ p‬من اليسار إلى اليمين مكررا ً الخطوتين‬ ‫‪ 3‬و ‪ 4‬حتى تصل القوس اليميني ‪. OP2‬‬ ‫ب‪ /‬أجري العملية الحسابية ‪.+AB‬‬ ‫تكتب‬ ‫‪A+B‬‬ ‫مثل ً ‪-:‬‬ ‫حيث ‪ + A B‬عبارة من نوع ‪ Postfix notation‬ولها نفس المعنى‬ ‫للمعادلة ‪a+b‬‬ ‫يمكن استخدام المكدسة في حساب قيمة ‪ + A B‬أي حساب‬ ‫‪.‫الجراء أو الدالة ‪addstack‬‬ ‫وظيفتها هي جمع محتويات المكدسة ‪. postfix notation‬‬ ‫‪ -2‬التحويل من إلـ ‪ infix notation‬إلى الـ ‪. ‪Until element‬‬ ‫مثال ‪-:‬‬ ‫إذا كانت المكدسة ‪ S‬هي ‪-:‬‬ ‫فإن نداء الدالة ‪ addstack‬تعطى بالمكدسة ‪-:‬‬ ‫تمرين‬ ‫أكتب البرامج الفرعية ‪ addstack . addtop‬بناًء على الخوارزمية‬ ‫السابقة ‪.‬‬ ‫‪7‬‬ .‬‬ ‫‪ -3‬إذا كان العنصر معامل ضعه في المكدسة ‪.

Infix‬‬ ‫أضف " ( " إلى المكدسة و " ) " إلى نهاية المعادلة ‪. S‬‬ ‫‪ -7‬النهاية ‪.A‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪( PUSH ( S . B‬‬ ‫‪OP2‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪PUSH( S. RESULT‬‬ ‫‪RESULT = OP1 + OP2‬‬ ‫‪4‬‬ ‫)‪( OP1 = POP(S‬‬ ‫مثال ‪-:‬‬ ‫أحسب قيمة ‪ABC+D‬‬ ‫‪. B=3‬‬ ‫‪1‬‬ ‫‪OP2 = POP(S‬‬ ‫‪3‬‬ ‫) ‪(Push ( S .B‬‬ ‫‪2‬‬ ‫)‪(PUSH (S. ( 4‬‬ ‫‪ -5‬أنهي التكرار في الخطوة ) ‪.C‬‬ ‫‪3‬‬ ‫)‪PUSH(S.‫د‪ /‬انهي الخطوة ) ‪. Q‬‬ ‫‪-1‬‬ ‫‪8‬‬ .‬‬ ‫مثال ‪ :‬يوضح خطوات حساب المعادلة ‪ + A B‬إذا كانت قيمة = ‪A‬‬ ‫‪5‬و‪. ( 2‬‬ ‫‪ -6‬أجعل قيمة المعادلة أ تساوي قمة المكدسة ‪.A=5 ، B=3 ، C=1 ، D=2‬‬ ‫إذا كانت قيمة‬ ‫‪4‬‬ ‫‪PUSH(S. A‬‬ ‫‪2‬‬ ‫) ‪Push ( S . D‬‬ ‫‪1‬‬ ‫‪5‬‬ ‫التحويل من ‪ Infix notation‬إلى ‪-: Postfix notation‬‬ ‫خوارزمية التحويل ‪-:‬‬ ‫ليكن لدينا المعادلة ‪ Q‬مكتوبة بطريقة ‪.

‬‬ ‫) ب (أضف الرمز الرياضي للمكدسة ) ‪ ( S‬وأنهي الخطوة ) ‪. +‬‬ ‫‪10‬‬ ‫‪P = ABC+‬‬ ‫‪11‬‬ ‫‪P = ABC+‬‬ ‫‪9‬‬ ‫‪4‬‬ ‫‪P=A‬‬ ‫‪8‬‬ ‫‪P = AB‬‬ ‫‪12‬‬ ‫‪P = ABC+‬‬ . POSTFIX‬‬ ‫حول المعادلة ‪A-(B+C)*D‬‬ ‫‪1‬‬ ‫‪P = AB‬‬ ‫‪PUSH ( S .‬‬ ‫) ب( أحذف القوس " ( " من المكدسة )‪ ( S‬ل تضفه إلى ‪ ، P‬أنهي الخطوة ) ‪( 6‬‬ ‫‪.( Postfix‬‬ ‫إذا كان العنصر المعالج من ‪ Q‬قوس يساري أضفه إلى المكدسة ‪. -‬‬ ‫‪3‬‬ ‫‪P=A‬‬ ‫‪6‬‬ ‫‪P = ABC‬‬ ‫‪7‬‬ ‫‪P = ABC‬‬ ‫) ‪( PUSH ( S .‬‬ ‫إذا كان العنصر المعالج من ‪ Q‬هو معامل أضفه إلى ‪ ) P‬وهي المعادلة التي‬ ‫‪-3‬‬ ‫تمثل ‪.‫عالج عناصر ‪ Q‬من اليسار إلى اليمين مكررًا الخطوات ‪ 6 – 3‬حتى تكون‬ ‫‪-2‬‬ ‫المكدسة فارغة ‪.‬‬ ‫مثال ‪-:‬‬ ‫من ‪ INFIX‬إلى ‪. ( 5‬‬ ‫إذا كان العنصر المعالج من ‪ Q‬هو قوس يميني نفذ أ و ب ‪-:‬‬ ‫‪-6‬‬ ‫) أ ( أحذف من المكدسة ‪ S‬كل رمز حسابي وأضفه إلى ‪ P‬حتى تصل إلى أول‬ ‫قوس يساري ‪. C‬‬ ‫‪5‬‬ ‫‪P = ABC+‬‬ ‫‪POP ( S‬‬ ‫‪9‬‬ ‫‪P = ABC+D‬‬ ‫‪2‬‬ ‫‪P=A‬‬ ‫) ‪( PUSH ( S .‬‬ ‫‪ -7‬انهي التكرار في الخطوة ‪. 2‬‬ ‫‪ -8‬النهاية ‪.‬‬ ‫‪-4‬‬ ‫إذا كان العنصر المعالج من ‪ Q‬رمز رياضي نفذ الخطوات ) أ ( و )ب( ‪-:‬‬ ‫‪-5‬‬ ‫) أ ( أحذف من المكدسة كل رمز رياضي له نفس المستوى ) ‪ ( +‬في التنفيذ أو‬ ‫أعلى منه في التنفيذ وأضفه إلى ‪ P‬حتى أول قوس يساري ‪.

Maxarray = 50‬‬ ‫‪Type‬‬ ‫‪.maxarray ]of char‬‬ ‫‪Var‬‬ ‫‪10‬‬ .‬‬ ‫‪ – 3‬مستخدمًا خوارزمية التحويل إلى ‪POSTFIX NOTATION‬‬ ‫قم بتحويل المعادلت التالية ‪-:‬‬ ‫‪A+B*C‬‬ ‫أ‪/‬‬ ‫ب‪A + B) * C ) /‬‬ ‫ج‪(A * B / C ) / (A . Arr = array [ 1.ABCD‬‬ ‫‪D = 13‬‬ ‫‪.D) /‬‬ ‫تمرين‪-:‬‬ ‫البرنامج الفرعي التالي يقوم بحساب معادلة مكتوبة بـ ‪ postfix‬قم بتنفيذ البرنامج‬ ‫على الجهاز ‪. C = 18 . A = 25‬‬ ‫موضحا شكل المكدسة ‪. Program evalute‬‬ ‫‪Const‬‬ ‫‪.‫‪PUSH ( S‬‬ ‫‪13‬‬ ‫* ‪P = ABC+D‬‬‫‪POP ( S‬‬ ‫) ‪( + . A = 17‬‬ ‫‪ -2‬قم بحساب المعادلة ‪+ * .('Value :=Ord (ch)-ord('0‬‬ ‫وماذا تعني العبارة‬ ‫‪.‬‬ ‫‪.‬‬ ‫حيث ‪B = 2 . B=3‬‬ ‫حيث ‪. POP ( S‬‬ ‫‪15‬‬ ‫‪14‬‬ ‫*‪P=ABC+D* P = ABC+D‬‬ ‫) ‪( POP ( S‬‬ ‫‪16‬‬ ‫‪P = ABC+D‬‬ ‫تمارين ‪-:‬‬ ‫‪ -1‬قم بحساب المعادلة *‪(AB – C (POSTFIX NOTATION‬‬ ‫‪C=2‬‬ ‫‪..

maxarray . Opnd2 . X : arr . Opnd1 .x:real {body of push} .top:= 0 .maxarray . Item : array [ 1.value end else {begin{operator is found . Value : real .st.op2 : real) : real {body of oper} {begin {function eval ..[ch:=arr[position while ch < > ' ' do { begin{ is found if op(ch)then begin .maxstack . Function eval ( x : arr ) :real Const . Ch : char .(Procedure push (var s:stack. Top : 0.. Position : 1.maxstack ] of real . Maxstack = maxarray Type Stack = record .(push(st. Function op(ch:char):boolean {body of op} ..op1. function oper (ch:char . St : stack ...(opnd2:=pop(st 11 . Position : 1.position := 1 . Function pop (var s:stack):real { body of pop } .('value :=ord(ch)-ord('0 . End Var .

('write('enter your postfix expression for i:= 1 to maxarray do .end -: ‫في التمرين السابق نجد‬ ‫ هي دالة اختبار هل الرمز المدخل رقم أم ل‬Op ‫الدالة‬ -1 False ‫ في حالة الرقم و‬true ‫حيث تقوم بإرجاع نتيجة منطقية‬ .end .(eval:= pop(st .(opnd1:=pop(st . ' ' =:ch .opnd1. ‫خلف ذلك‬ : ‫ويمكن أن نكتب الدالة بالشكل التالي‬ .value end if position < maxarray then begin .position:= position + 1 .opnd2 . ( [ read ( arr [ position .eval(arr .[ ch:=arr [ position end else . ( [ write ( arr [ position .writeln .end begin . readln ..(push(st.((writeln('value of postfix is '.(' writeln(' original postfix expression is for position:=1 to maxarray do .(value:=oper (ch. Function op (ch:char):boolean Begin (('If (ord(ch)>=ord ('0')) and (ord(ch)<= ord('9 Then op:=true Else op:=false 12 .

Function oper (ch:char . End ‫ إذا كان العنصر رمز رياضي فإنها تقوم‬oper ‫نجد الدالة‬ -2 . end 13 . ' / ' ] then Case ch of .' .n . end -: ‫التطبيق الثاني‬ ‫ باستخدام المكدسة أكتب برنامج يقوم بحساب‬-3 .oper :=op1 / op2: '/' end else . End -: ‫كتابة البرنامج باستخدام المكدسة‬ . ‫المضروب‬ -: ‫ أول ً كتابة البرنامج بدون استخدام المكدسة‬-4 .function factorial(n:integer ) : real var .op1.oper :=op1 .oper :=op1 + op2: '+' .oper :=op1* op2: '*' . ' .( Factorial := n*factorial ( n ..1 .s:stack . ( 'writeln('error illegal operator . Function factorial ( n : integer ) : real Begin If n=0 then factorial:=1 Else . ‫بإجراء العملية الرياضية على العنصرين التاليين‬ : ‫فيمكن كتابة الدالة على الشكل التالي‬ .(push(s. ' * ' .op2: '-' . (initialize(s while (n>0) and (not full(s)) do begin .fact:real begin . n:=n-1 .op2 : real ) : real Begin If ch in [' + ' .

( ' writeln( ' stack over flow‬‬ ‫‪end‬‬ ‫‪else‬‬ ‫‪begin‬‬ ‫‪.‬‬ ‫التحويل من عشري إلى ثنائي ‪-:‬‬ ‫الخوارزمية ‪-:‬‬ ‫‪ -1‬أقسم العدد على الرقم ‪ 2‬وأدفع بالباقي من القسمة داخل المكدسة ‪.‬‬ ‫‪ -3‬قم بتفريغ المكدسة وأطبعها على الشاشة ‪.‬‬ ‫‪ -2‬من عشري إلى ثماني ‪.end‬‬ ‫التطبيق الثالث‪-:‬‬ ‫التحويل من نظام عددي إلى نظام عددي آخر باستخدام‬ ‫المكدسة ‪. fact:=n*fact‬‬ ‫‪.‬‬ ‫و‪ -‬من سداسي عشري إلى عشري ‪.‬‬ ‫‪14‬‬ .‬‬ ‫استمر في تنفيذ الخطوة )‪ (1‬و )‪ (2‬حتى نحصل على خارج قسمة تساوي صفر ‪.‬‬ ‫هـ‪ -‬من ثماني إلى عشري ‪.factorial:=-1‬‬ ‫‪. factorial := fact‬‬ ‫‪.‬‬ ‫د‪ -‬من ثنائي إلى عشري ‪.‬‬ ‫‪ -1‬من عشري إلى ثنائي ‪.‬‬ ‫‪ -2‬اجعل خارج القسمة مكان العدد ‪.‬‬ ‫ج‪ -‬من عشري إلى سداسي عشري ‪.‫‪if (n>0) and (full(s))then‬‬ ‫‪begin‬‬ ‫‪. fact:= 1‬‬ ‫‪while not empty(s) do‬‬ ‫‪begin‬‬ ‫‪.‬‬ ‫الحل ‪-:‬‬ ‫تستخدم الوحدة ‪ Stack‬التي تحتوي على كل البرامج الفرعية‬ ‫الخاصة بالمكدسة ‪. end‬‬ ‫‪. (pop(s‬‬ ‫‪.end‬‬ ‫‪.

2‬‬ ‫تمرين‪-:‬‬ ‫أكتب برنامج يقوم بتحويل الرقم العشري إلى نظيره‬ ‫‪-1‬‬ ‫السداسي عشري باستخدام المكدسة ‪ . Uses stack‬‬ ‫‪Begin‬‬ ‫‪.rear‬ويسمى بالـ ‪.‬‬ ‫‪ -2‬قم بكتابة برنامج يحول الرقم الثماني إلى نظيره العشري ‪.(Push (s.‬‬ ‫أنواع الصفوف ‪-:‬‬ ‫الصف الخطي ‪. Circular Queue‬‬ ‫‪-2‬‬ ‫مفاهيم لتمثيل الصفوف ‪-:‬‬ ‫‪15‬‬ . linear Queue‬‬ ‫‪-1‬‬ ‫الصف الدائري ‪.N:= n div 2‬‬ ‫‪. Until n=0‬‬ ‫‪While not empty (s) do‬‬ ‫‪.. FIFO‬‬ ‫)‪(first in first out‬‬ ‫الداخل أول ً هو الخارج أول ً ويطلق علية أيضا ً ‪first in fist services‬‬ ‫القادم أول ً يخدم أول ً ‪.‬الخ ‪.(' Write ('input your decimal number‬‬ ‫‪..End‬‬ ‫في حالة التحويل من عشري إلى ثماني تقوم بالقسمة على ‪ 8‬بدل ً‬ ‫من الرقم ‪.‬‬ ‫مساعده ‪-:‬‬ ‫استخدم الدالة ‪ Addtop‬و الدالة ‪.X:=n mod 2‬‬ ‫‪.Readln‬‬ ‫‪.(Read (n‬‬ ‫‪Repeat‬‬ ‫‪.‬مع ملحظة الرقم ‪10‬‬ ‫يقابله حرف ‪ A‬والرقم ‪ 11‬يقابله حرف الـ ‪ B‬و ‪ .front‬بينما يتم إضافة العناصر من الطرف الخر ويسمى‬ ‫بالمؤخرة أو الذيل ‪ tail. ((Writeln(pop(s‬‬ ‫‪. Addstack‬‬ ‫الصفوف ‪Queues‬‬ ‫الصف هو قائمة من العناصر تحفظ بطريقة خطية بحيث يمكن‬ ‫حذف العناصر من طرف واحد يسمى المقدمة أو الرأس‬ ‫‪ head.‫‪.x‬‬ ‫‪.

2‬‬ ‫المؤخرة خطوة واحدة للمام ‪.‬‬ ‫‪16‬‬ .‬‬ ‫‪Rear = 0‬‬ ‫‪Front = 0‬‬ ‫‪ -4‬الصف الخطي والحالة البتدائية المقدمة تساوي الواحد والمؤخرة تساوي‬ ‫الصفر ‪.‬‬ ‫‪Rear = 0‬‬ ‫‪Front = 1‬‬ ‫‪ -3‬الصف الخطي والحالة البتدائية المقدمة تساوي المؤخرة تساوي صفر ‪.1‬‬ ‫إلى الصفر ‪.‬‬ ‫الحالة الثانية تمت إضافة العنصر ‪ A‬إلى مؤخرة الصف وحركت‬ ‫‪.‬‬ ‫‪Rear = 0‬‬ ‫‪Front = 1‬‬ ‫الصف الدائري والحالة البتدائية فيها المقدمة تساوي المؤخرة تساوي صفر ‪.‫تختلف تمثيل الصفوف وشروط العمليات الخاصة به باختلف الحالة البتدائية للصف‬ ‫فيمكن تمثيل المفاهيم التالية ‪-:‬‬ ‫‪ -1‬الصف الدائري والحالة البتدائية المقدمة تساوي المؤخرة تساوي صفر ‪.‬‬ ‫‪ -2‬المؤخرة دائمًا تشير إلى موقع خالي ‪.‬‬ ‫‪Rear = front = 0‬‬ ‫‪ -2‬الصف الدائري والحالة البتدائية المقدمة تساوي الواحد والمؤخرة تساوي‬ ‫الصفر ‪.‬‬ ‫‪ -3‬يكون الصف خالي إذا كانت المؤخرة والمقدمة تشيران إلى نفس الموقع كما‬ ‫في الحالة الولى والحالة الخامسة ‪.‬‬ ‫تحليل الصف الدائري السابق ‪-:‬‬ ‫‪ -1‬الحالة البتدائية هو إن المقدمة والمؤخرة تشيران إلى الصفر ‪.‬‬ ‫‪ -4‬يكون الصف ممتلئ إذا كان عدد عناصر الصف أقل بواحد من طول الصف‬ ‫الكلي كما في الحالة الثامنة ‪.‬‬ ‫‪ -5‬شرح العمليات على الصف الدائري السابق ‪-:‬‬ ‫الحالة الولى الصف في حالة البتدائية المؤخرة والمقدمة تشيران‬ ‫‪.

6‬‬ ‫المؤخرة خطوة واحدة للمام ‪.(Delete(Q‬‬ ‫العلن عن الصف ‪-:‬‬ ‫يمكن تمثيل الصف باستخدام المصفوفات وفي هذه الحالة يمكن أن نمثل الصف بسجل‬ ‫يحتوي على حقل لتمثيل المصفوفة وحقلين للمقدمة والمؤخرة ‪ rear . MaxQueue-1] of integer‬‬ ‫‪.‬‬ ‫الحالة الخامسة تم حذف العنصر ‪ B‬من مقدمة الصف وتحريك‬ ‫‪. Q:Queue‬‬ ‫الدالة ‪-:empty‬‬ ‫‪17‬‬ .‬‬ ‫الحالة السادسة تم إضافة العنصر ‪ A‬إلى مؤخرة الصف وحركت‬ ‫‪.8‬‬ ‫المؤخرة خطوة واحدة للمام ‪.End‬‬ ‫‪Var‬‬ ‫‪.Item :array [ 0. Rear . (Insert(Q.‬‬ ‫الحالة الرابعة تم حذف العنصر ‪ A‬من مقدمة الصف الدائري‬ ‫‪.‬‬ ‫الحالة السابعة تمت إضافة العنصر ‪ B‬إلى مؤخرة الصف وحركت‬ ‫‪.‬‬ ‫‪Const‬‬ ‫‪. front‬حيث‬ ‫‪ front‬إلى موقع العنصر الول في الصف و ‪ rear‬إلى الموقع يقع خلف العنصر‬ ‫الخير في الصف مباشرة إي أنة يكون خاليًا بصفة دائمة ‪. front :integer‬‬ ‫‪.4‬‬ ‫وحركت المقدمة خطوة للمام ‪.5‬‬ ‫المقدمة خطوة للمام )هنا المؤخرة تساوي المقدمة التي أصبحت خالية ‪.‫الحالة الثالثة تمت إضافة العنصر ‪ B‬إلى مؤخرة الصف وحركت‬ ‫‪.7‬‬ ‫المؤخرة خطوة واحدة للمام ‪.‬‬ ‫الحالة الثامنة تمت إضافة العنصر ‪ C‬إلى مؤخرة الصف وحركت‬ ‫‪..MaxQueue=100‬‬ ‫‪type‬‬ ‫‪Queue=record‬‬ ‫‪.3‬‬ ‫المؤخرة خطوة واحدة للمام ‪.A‬‬ ‫‪ -2‬عملية الحذف ‪ Delete‬وتأخذ وسيط واحد وهو الصف حيث يتم حذف العنصر‬ ‫الموجود في المقدمة‬ ‫‪.‬‬ ‫أنواع العمليات على الصف الدائري ‪-:‬‬ ‫عملية الضافة ‪ Insert‬وتأخذ وسيطين الول الصف والخر العنصر المراد‬ ‫‪-1‬‬ ‫إضافته للصف‬ ‫‪.

‬‬ ‫ن‬ ‫‪-2‬‬ ‫وع الوسيط هي ‪ value parameter‬لن الختبار ل يؤثر على محتوى الصف ‪. Function full(Q:Queue):boolean‬‬ ‫‪Begin‬‬ ‫‪With Q do‬‬ ‫‪If rear+1 mod maxQueue = front then full :=true‬‬ ‫‪Else‬‬ ‫‪.‬‬ ‫‪-4‬الشرط هو أن المقدمة والمؤخرة تشيران إلى نفس الموقع ‪.‬‬ ‫‪-1‬‬ ‫‪ -2‬نوع الوسيط ‪ value parameter‬لن الختبار ل يؤثر على محتوى الصف ‪.End‬‬ ‫استخدام الدالة ‪-:full‬‬ ‫‪18‬‬ .‬‬ ‫ا‬ ‫‪-4‬‬ ‫‪.‬‬ ‫‪-5‬الخوارزمية‪ :‬إذا كان الصف خالي ترجع قيمة منطقية ‪ true‬و إل ترجع ‪false‬‬ ‫كتابة الدالة‪-:‬‬ ‫‪. ('If empty (Q) then writeln('Queue empty‬‬ ‫الدالة ‪-: full‬‬ ‫ا‬ ‫‪-1‬‬ ‫لوسائط الـ ‪ parameter‬هي الصف فقط ‪.،‬‬ ‫‪-3‬الوظيفة اختبار إذا كان الصف خالي أم ل ‪. rear +1 mod maxQueue = front‬‬ ‫لشرط هو أن‬ ‫ا‬ ‫‪-5‬‬ ‫لخوارزمية ‪-:‬إذا تحقق الشرط ترجع قيمة منطقية ‪ true‬وإل ‪. Function empty( Q:Queue):boolean‬‬ ‫‪Begin‬‬ ‫‪If Q.End‬‬ ‫استخدام الدالة ‪-: empty‬‬ ‫نحتاج لختبار الصف قبل أي عملية حذف فإذا كان الصف خالي فإن عملية الحذف‬ ‫تؤدي إلى ما يسمى ‪.rear := Q.Empty:= false‬‬ ‫‪.‫الوسائط ‪ parameter‬هي الصف فقط ‪. false‬‬ ‫كتابة الدالة ‪-:FULL‬‬ ‫‪.‬‬ ‫ا‬ ‫‪-3‬‬ ‫لوظيفة اختبار إذا كان الصف ممتلئ أم ل ‪. Full := false‬‬ ‫‪. Under flow‬‬ ‫فيمكن نداءها داخل البرنامج كالتي ‪-:‬‬ ‫‪.front then empty := true‬‬ ‫‪Else‬‬ ‫‪.

End‬‬ ‫‪. (value parameter‬‬ ‫ا‬ ‫‪-3‬‬ ‫لوظيفة يقوم الجراء بدفع العنصر إلى مؤخرة الصف ‪.‬‬ ‫فيمكن نداءها داخل البرنامج كالتي ‪-:‬‬ ‫‪.‬‬‫أ‪ -‬أسند العنصر إلى مؤخرة الصف ‪.‬‬ ‫كتابة الجراء ‪-:‬‬ ‫‪.rear := Q.rear]:= x‬‬ ‫‪.‬‬ ‫ن‬ ‫‪-2‬‬ ‫وع الوسيط ‪ variable parameter :‬لن الحذف سوف يغير من محتوى الصف‬ ‫‪19‬‬ .‬‬ ‫ب‪ -‬قم بتحريك المؤخرة بمقدار واحدة ‪.‬‬ ‫ا‬ ‫‪-4‬‬ ‫لخوارزمية ‪-:‬‬ ‫ اختبر إذا كان الصف ممتلئ أعطي رسالة خطأ وإل نفذ أ و ب ‪. x : integer‬‬ ‫‪Begin‬‬ ‫‪If full (Q) then‬‬ ‫‪('Writeln ('Queue is full‬‬ ‫‪Else‬‬ ‫‪Begin‬‬ ‫‪.item [Q.('If full (Q) then writeln ('Queue is full‬‬ ‫الجراء ‪-:insert‬‬ ‫ا‬ ‫‪-1‬‬ ‫لوسائط الـ ‪parameter‬هما الصف والعنصر المراد إضافته ‪.‬‬ ‫ن‬ ‫‪-2‬‬ ‫وع الوسائط) الصف ‪ variable parameter‬لن الضافة سوف تغير من محتوى‬ ‫الصف بينما العنصر ‪.‫تستخدم لختبار الصف قبل أي عملية إضافة فإذا كان الصف ممتلئ فإن إضافة أي‬ ‫عنصر تؤدي إلى ما يسمى ‪ ) over flow‬الفيضان ( ‪. Q.(Procedure insert (var Q:Queue .rear +1 mod maxQueue‬‬ ‫‪.End‬‬ ‫الدالة ‪-: delete‬‬ ‫ا‬ ‫‪-1‬‬ ‫لوسائط الـ ‪ parameter‬هو الصف فقط ‪. Q.

‬‬ ‫كتابة الدالة ‪-:‬‬ ‫‪Function delete(var Q:Queue):integer‬‬ ‫‪Begin‬‬ ‫‪('If empty (Q) then writeln('Queue is empty‬‬ ‫‪Else‬‬ ‫‪Begin‬‬ ‫‪.front:= 0‬‬ ‫‪.front :=Q.rear:= 0‬‬ ‫‪.Q.item[Q.‬‬ ‫‪.End‬‬ ‫الجراء ‪-: Initialize‬‬ ‫‪-1‬‬ ‫الوسيط ‪ parameter‬هو الصف فقط ‪.‫‪-3‬‬ ‫لوظيفة ‪ :‬حذف العنصر الموجود في مقدمة الصف ‪.front‬‬ ‫‪.‬‬ ‫ب‪ -‬قم بتحريك المقدمة بمقدار واحد ‪.front +1 mod maxQueue‬‬ ‫‪.End‬‬ ‫‪.[Delete :=Q.‬‬ ‫‪-4‬‬ ‫الشرط هو جعل المقدمة والمؤخرة تشيران إلى الصفر ‪. variable parameter‬‬ ‫‪-3‬‬ ‫الوظيفة إفراغ محتويات الصف أي إرجاعها إلى الحالة‬ ‫البتدائية ‪.Q.‬‬‫أ‪ -‬أحذف العنصر الموجود في المقدمة ‪.End‬‬ ‫‪20‬‬ ‫ا‬ ‫ا‬ .‬‬ ‫‪-2‬‬ ‫نوع الوسيط ‪.‬‬ ‫‪-4‬‬ ‫لخوارزمية ‪-:‬‬ ‫ اختبر إذا كان الصف خالي أعطي رسالة خطأ وإل نفذ أ و ب ‪.Q.(Procedure initialize ( var Q : queue‬‬ ‫‪Begin‬‬ ‫‪.

item[i‬‬ ‫‪.(Procedure display (Q:Queue‬‬ ‫‪Var‬‬ ‫‪.‬‬ ‫‪-2‬‬ ‫ط ‪ :‬حلقه تكرارية بعدد الخانات الممتلئة في الصف ‪.‬‬ ‫نوع‬ ‫‪-4‬‬ ‫الوسيط ‪ value parameter‬لن الطباعة ل تؤثر على محتويات الصف ‪. (' '. [write (Q.rear do‬‬ ‫‪.fron > Q.item[i‬‬ ‫‪Else‬‬ ‫‪for I :=Q .‬‬ ‫كتابة البرنامج ‪-:‬‬ ‫‪.rear do‬‬ ‫‪. ( ' '. end‬‬ ‫‪21‬‬ . (to‬‬ ‫الوسيط ‪ :‬الـ ‪ parameter‬هو الصف فقط ‪.front to Q.rear then‬‬ ‫‪For I := Q.‬‬ ‫عر‬ ‫الشر‬ ‫الخوا‬ ‫‪-3‬‬ ‫رزمية إذا كانت المقدمة أكبر من المؤخرة فإن طباعة العنصر تتم بحلقة تكرارية‬ ‫تنازلية )‪ (for downto‬وإل طباعة العنصر تتم بحلقة تكرارية تصاعدية )‪for-‬‬ ‫‪.[Write ( Q.I:integer‬‬ ‫‪Begin‬‬ ‫‪If Q.‫الجراء ‪-: display‬‬ ‫‪-1‬‬ ‫ض محتويات الصف ‪.front downto Q.

front = 1‬‬ ‫‪ -2‬يكون الصف خالي إذا كانت المقدمة أكبر من المؤخرة ‪. rear=0 .‬‬ ‫العلن عن الصف الخطي‪-:‬‬ ‫هو نفس العلن عن الصف الدائري فقط في هذه الحالة طول المصفوفة تبدأ من‬ ‫ل من الصفر‪.‫الصف الخطي‬ ‫الصف الخطي والحالة البتدائية المقدمة تساوي الواحد والمؤخرة تساوي العنصر ‪.‬‬ ‫طول الصف يحتوي على خمسة عناصر فقط ‪.‬‬ ‫يمكن‬ ‫‪-2‬‬ ‫أن يتحقق شرط المتلء وتكون هنالك خانات خالية كما في الحالة السابقة ‪. rear < front‬‬ ‫‪ -3‬يكون الصف ممتلئ إذا كانت المؤخرة تساوي طول الصف ‪.‬‬ ‫في‬ ‫‪-3‬‬ ‫ل ثم إدخال العنصر ثانية بينما في الحذف حذف العنصر‬ ‫الضافة تحرك المؤخرة أو ً‬ ‫ل ثم تحرك المقدمة‪.‬‬ ‫‪Rear = maxQueue‬‬ ‫والرسمة التالية توضح شروط الصف الخطي السابق ‪.‬‬ ‫أو ً‬ ‫المؤ‬ ‫‪-4‬‬ ‫خرة ل تشير إلى مكان خالي وبذلك يمكن استغلل كل كائنات الصف ‪.‬‬ ‫ملحظات على الصف الخطي‪-:‬‬ ‫إذا‬ ‫‪-1‬‬ ‫ساوت المقدمة المؤخرة فإن الصف يحتوي على عنصر واحد فقط ‪.‬‬ ‫الواحد بد ً‬ ‫‪22‬‬ .‬‬ ‫شروطه ‪-:‬‬ ‫‪ -1‬الحالة البتدائية ‪.

Function Full (Q : Queue ):Boolean Begin If Q..front=1) and (Q.Function full (Q:Queue):boolean Begin .End Var .front > Q.(Empty := (Q.rear = 0 . Item:array[1. Empty := false . Function empty (Q:Queue):boolean Begin .rear = max .rear = maxQueue then full := true Else .rear then empty := true Else . front : integer .maxQueue] of integer . Full :=false . End -: empty ‫الدالة‬ . function delete (var Q:Queue):integer begin ('if empty (Q) then write ('Queue is empty 23 . Full:=Q.End -: ‫ويمكن كتابة الدالة بالعبارات التالية‬ .End -: delete ‫الدالة‬ .End : ‫ويمكن كتابة الدالة بطريقة أخرى‬ . Rear . Q:Queue -: Full ‫الدالة‬ . MaxQueue = 100 Type Queue = record .Const . Function empty(Q:Queue):boolean Begin If Q.

front >Q.‬‬ ‫‪2‬اجعل الصف الثاني فارغَا ‪.‬‬ ‫الجراء ‪initialize‬‬ ‫‪.‬‬‫البرنامج‪:‬‬ ‫‪24‬‬ .‬اكتب برنامج يحاكى عمل الصف الدائري والحالة البتدائية المقدمة والمؤخرة‬ ‫تساويان الصفر ‪.rear then initialize (Q‬‬ ‫‪.q.‬‬ ‫‪ -1‬كرر من مقدمة الصف الثاني إلى مؤخرة الصف الثاني‬ ‫‪-1‬‬ ‫حرك مقدمة الصف الول‪.‬‬ ‫خوازرميه دمج صفين خطين‬ ‫إذا كان طول الصف الول – موقع مؤخرة الصف الول )رقم الحجرة (اقل من‬ ‫طول الصف الثاني أعطى رسالة بعدم امكانيه الدمج وآل‪. Q front :=Q.front + 1‬‬ ‫‪.front‬‬ ‫‪. front=1‬‬ ‫‪3‬اكتب برنامج يقوم بالبحث عن عنصر محدد في المصفوفة‪.‫‪else‬‬ ‫‪begin‬‬ ‫‪.item[Q.fornt:=0‬‬ ‫‪.rear:=0‬‬ ‫‪.q.‬‬‫مثال‬ ‫اكتب برنامج يقوم بدمج مصفوفتين‪.End‬‬ ‫‪.‬‬ ‫‪Rear=front=0‬‬ ‫‪2‬اكتب برنامج يحاكى عمل الصف الخطى والحالة البتدائية المقدمة‬‫تساوى الواحد والمؤخرة تساوى الصفر ‪. [delete :=Q.end‬‬ ‫أمثلة محلوله ‪:‬‬ ‫‪1. End‬‬ ‫ملحوظة ‪-:‬‬ ‫للستفادة من الخانات الخالية السابقة نقوم بإرجاع الصف‬ ‫إلى الحالة البتدائية متى ما أصبح الصف فارغًا ‪. rear=0 .‬‬ ‫‪-2‬‬ ‫اسند عنصر العداد إلي مقدمة الصف الول‪. (If Q.(procedure initialize(var q:queue‬‬ ‫‪begin‬‬ ‫‪.

(Procedure addqueue(var Q1:queue1.End .’ is found Else ..(’Writeln(target.Readln .item[I .rear then writeln(target.front>q.q.’ is not found .front] then .front<=q.[Q1.end -:‫لزيادة كفاءة الجراء السابق نقوم بالتي‬ ‫عند العثور على الهدف نعطى رسالة بذلك ثم نخرج من البرنامج حتى ل يأخذ البرنامج‬ .front To Q2.Q1.’ is found .I:integer Begin If (Maxqueue1-(Q1.front:=q.rear:=Q1.rear do Begin .end :‫مثال‬ .rear)<maxqueue2)then .‫لنه إذا تم العثور على الهدف فليس هنالك حوجه للستمرار في عملية البحث‬ -:‫فيعدل البرنامج كالتي‬ If target=q.rear]:=Q2.('Write('can not addqueue Else For I:=Q2.item[q.(Procedure search(q:queue.item[q.end .front] then writeln(target.Exit 25 .front+1 . ‫اكتب برنامج يقوم بالبحث عن عنصر في الصف الخطى‬ -:‫عملية البحث في الصف الخطى‬ .target:integer Begin While(q.rear+1 .(’if q.rear) do Begin (’If target=q. ‫زمن اكبر في عملية البحث‬ .Readln .(Initialize(Q2 .var Q2:queue2 Var .item[Q1.

front:=q.‫‪End‬‬ ‫‪Else‬‬ ‫‪.Name:string‬‬ ‫‪.End‬‬ ‫‪Var‬‬ ‫‪.Node_pointer=^node‬‬ ‫‪Node=record‬‬ ‫‪.Age:integer‬‬ ‫‪.‬‬ ‫ل‬ ‫‪-2‬‬ ‫اتحدث مشكله ‪overflow‬لن المساحة في الزاكره تكون مفتوحة غير محدده ‪.‬‬ ‫وهى في الحقيقة سجلت مرتبطة مع بعضها البعض بواسطة المؤشرات‪.( Dynamic data type‬‬ ‫وبنية البيانات المتحركة عبارة عن مجموعه من العناصر تسمى عقدا ‪nodes .Pointer_variable=^data type‬‬ ‫أمثلة‪:‬‬ ‫‪Type‬‬ ‫‪.Q:node_pointer‬‬ ‫‪26‬‬ .‬‬ ‫مميزات بنيه البيانات المتحركة المتحركة‬ ‫‪-1‬‬ ‫يمكن أن تتمدد وتنكمش أثناء تنفيذ البرنامج ‪.‬‬ ‫العلن عن المؤشرات‪:‬‬ ‫‪Var‬‬ ‫‪.P.front+1‬‬ ‫فالعبارة ‪ exit‬تؤدى للخروج من البرنامج‪.q.Pointer_variable:^data type‬‬ ‫أو‬ ‫‪Type‬‬ ‫‪.R.‬‬ ‫المؤشرات ‪Pointers‬‬ ‫هي متغيرات تمكن الوصول إلى حجرات الزاكره أثناء تنفيذ البرنامج فهي تشير‬ ‫دائمَا إلى عنوانين في الزاكره فهي تستخدم في بنيه البيانات المتحركة‬ ‫)‪.

Y:^string‬‬ ‫العبارة ‪New‬‬ ‫تقوم تخصيص مساحة تخزين في الزاكره أثناء تنفيذ البرنامج ‪.‬‬ ‫الصيغة العامة‪:‬‬ ‫‪.(New(Pointer_variable‬‬ ‫مثال‪:‬‬ ‫‪.(New(p‬‬ ‫‪.(New(R‬‬ ‫يمكن التعبير على العبارة السابقة في الزاكره كالتي‪-:‬‬ ‫‪(New(p‬‬ ‫‪emaN‬‬ ‫‪egA‬‬ ‫‪P‬‬ ‫‪(New(Q‬‬ ‫‪emaN‬‬ ‫‪egA‬‬ ‫‪Q‬‬ ‫‪(New(R‬‬ ‫‪Name‬‬ ‫‪Age‬‬ ‫‪R‬‬ ‫إسناد المؤشرات‬ ‫هو أن يشير المؤشر إلي المكان الذي يشير إليه مؤشر آخر‬ ‫ل‪:‬‬ ‫فمث َ‬ ‫‪.‫‪.P:=Q‬‬ ‫‪27‬‬ .(New(Q‬‬ ‫‪.X:^integer‬‬ ‫‪.

name:string‬‬ ‫‪.name‬‬ ‫مث َ‬ ‫وللوصول لحقل العمر في السجل ‪P‬نكتب ‪P^.P.(New(R‬‬ ‫‪.age:integer‬‬ ‫‪.nodepointer =^node‬‬ ‫‪node=record‬‬ ‫‪.R:=P‬‬ ‫‪.R^.P:=Q‬‬ ‫‪.(Writeln(P^.P^.name.name:='ahmed‬‬ ‫‪.age:=75‬‬ ‫‪.Q‬‬ ‫التعامل مع حقول العقده‬ ‫الصيغة العامة للوصول لحقل معين في العقده )‪(pointer_name^.(New(P‬‬ ‫‪.end‬‬ ‫‪var‬‬ ‫‪.Q^.R.'Q^.age:=25‬‬ ‫‪.(New(Q‬‬ ‫‪.Q:nodepointer‬‬ ‫‪Begin‬‬ ‫‪.End‬‬ ‫فان خرج البرنامج يكون كالتي ‪-:‬‬ ‫‪Ahmed 75 Ahmed Ali‬‬ ‫‪28‬‬ .‫‪ P‬اصبح يؤشر إلى نفس الموقع الذي يشير إليه‬ ‫فهذا يعنى أن المؤشر‬ ‫المؤشر ‪.age‬‬ ‫مثال ‪:‬‬ ‫‪type‬‬ ‫‪.Q^.'P^.name:='ali‬‬ ‫‪.name.P^.age.field‬‬ ‫ل للوصول لحقل السم في السجل ‪ P‬نكتب ‪P^.name‬‬ ‫‪.

P3.P3^.data:=P^.next.P4:=P1^.4‬‬ ‫‪29‬‬ ‫‪head‬‬ .next.‪P4^.P3^.‬‬ ‫‪.data:=P1^.‬‬ ‫الصيغة العامة‬ ‫‪.3‬‬ ‫‪.next:=P3^.next‬‬ ‫‪.2‬‬ ‫‪.next:=P1‬‬ ‫‪.1‬‬ ‫.P2^.next‬‬ ‫‪.P2^.data .data‬‬ ‫‪.P4^.‬‬ ‫تمرين ‪:‬‬ ‫السلسلة المتصلة التالية والمؤشرات ‪P1.(Dispose(pointername‬‬ ‫القيمة ‪Nil‬‬ ‫تمثل قيمة في الذاكرة وهو عنوان اللشىء ‪.next:=P2^.P4^.P2.next:=P1^.‫العبارة ‪Dispose‬‬ ‫هو إجراء يقوم بإنهاء تخصيص المكان المحجوز للمؤشر في الذاكرة ‪.data .P4‬‬ ‫‪P4‬‬ ‫‪rat‬‬ ‫‪P2‬‬ ‫‪P3‬‬ ‫‪ewe‬‬ ‫‪dog‬‬ ‫‪P1‬‬ ‫‪cat‬‬ ‫اعد رسم السلسلة بعض إجراء إي عمليه ووضح الخطاء إذا‬ ‫وجد خطاء في العمليات ‪.

Next:lptr‬‬ ‫‪.‫القوائم المتصلة ‪) linked list‬اللئحة المنغلقة(‬ ‫هي عبارة عن سلسله من العقد بحث أن كل عقده مرتبطة بالعقده التي تليها‪.Data:integer‬‬ ‫‪.Function creatlist:lptr‬‬ ‫‪Var‬‬ ‫‪.‬‬ ‫ومؤشر العقده الولى تسمى الرأس ‪ head‬والعقده أل خيره تشير إلى ‪nil‬‬ ‫وبذلك نحصل على طرف لئحة خاليه ‪.P:lptr‬‬ ‫‪30‬‬ .‬‬ ‫العلن عن عقده مكونه من حقلين ‪.‬‬ ‫‪-1‬‬ ‫إنشاء مؤشر من نوع ‪Lptr.‬‬ ‫‪.‬‬ ‫‪-2‬‬ ‫اجعل المؤشر يشير إلى ‪Nil.‬‬ ‫تستخدم اللوائح المنغلقة على سبيل المثــال فــي المترجمــات ونظــم التشــغيل ونظــم‬ ‫إدارة قواعد البيانات‪.‬‬ ‫تستخدم السجلت في بناء اللــوائح المنغلقــة وابســط ســجل يتكــون مــن حقليــن حقــل‬ ‫للبيانات وحقل آخر مؤشر إلى السجل التالي ‪.Lptr=^listnode‬‬ ‫‪Listnode=record‬‬ ‫‪.End‬‬ ‫إنشاء اللئحة المنغلقة‬ ‫الخوارزمية لنشاء اللئحة المنغلقة ‪.‬‬ ‫‪Type‬‬ ‫‪.

End‬‬ ‫إضافة عقده جديده‪:‬‬ ‫خوارزمية الضافة ‪.‬‬ ‫انش‬ ‫‪-1‬‬ ‫ىء عقــده جديــده مــن النــوع ‪ listnode‬تحتــوى علــى العــدد المــراد إضــافته إلــى‬ ‫اللئحة ‪.Newlptr:lptr‬‬ ‫‪.(New(newlptr‬‬ ‫‪With newlptr^ do‬‬ ‫‪Begin‬‬ ‫‪.‬‬ ‫‪31‬‬ .(Read(value‬‬ ‫‪.Value:integer‬‬ ‫‪Begin‬‬ ‫‪.‬‬ ‫‪.head:=creatlist.‬‬ ‫فيتم إنشاء مؤشر العقده الولى الـ ‪head .‫‪Begin‬‬ ‫‪.‬‬ ‫فنكتب ‪.Next:=nil‬‬ ‫‪.‬‬ ‫‪nil‬‬ ‫‪head‬‬ ‫ولضافة آي عقده للئحة فإننا نقوم بإنشاء عقده جديده عن طريق الدالة ‪getnode‬‬ ‫وهذه العقده الجديدة تكون النوع ‪ listnode‬ونشير إليها بمؤشر من النوع ‪newlptr‬‬ ‫ونقرا قيمه الحقل ‪ data‬ونجعل المؤشر ‪ next‬يشير إلى النهاية ‪nil.Creatlist:=p‬‬ ‫‪.(New(p‬‬ ‫‪.End‬‬ ‫ولنشاء اللئحة المنغلقة نقوم باستدعاء الدالة ‪ creatlist‬في البرنامج‬ ‫الرئيسي ‪.‬‬ ‫ويمكن رسم شكل المؤشر في الذاكرة كالتي بعض العبارة‬ ‫السابقة ‪.Getnode:=newlptr‬‬ ‫‪.('Writeln('enter integer value to add to the list‬‬ ‫‪.Function getnode:lptr‬‬ ‫‪Var‬‬ ‫‪.Data:=value‬‬ ‫‪.End‬‬ ‫‪.

data<head^.Head^.Head:=newptr .data=head^.data)then Begin .data>head^.data<head^.next:=temp End Else 32 . ‫وصلت نهاية اللئحة أضف العقده الجديدة في آخر اللئحة‬ :‫باستخدام النداء الذاتي يمكن كتابة داله الضافة كالتي‬ .Newptr^.next^. ‫قبل العقده الولى‬ ‫إذا‬ -3 ‫( مــع العقــده‬2) ‫كان العدد في العقده الجديدة اكبر من العدد في العقــده الولــى اجــر‬ .Newptr^.next .data)and(newptr^.next:=temp End Else if (newptr^.Temp:lptr Begin If head=nil then head:=newptr Else if (newptr^. ‫التالية مالم تصل إلى نهاية اللئحة‬ ‫إذا‬ -4 .Temp:=head .next:=newptr .data)then Begin .data) then writeln('this value is ('already in the list Else if (newptr^.(Procedure add(var head.newptr:lptr Var .‫إذا‬ -2 ‫كان العدد في العقده الجديدة اصغر من العدد في العقده الولى أضف العقده الجديدة‬ .Temp:=head^.

var target.‫‪.(Procedure search(head:lptr.data=x then‬‬ ‫‪Begin‬‬ ‫‪.pred‬‬ ‫البرنامج‬ ‫‪.next‬‬ ‫‪.‬‬ ‫إذا كان الهدف يساوى قيمة العدد في العقده التالية دع المؤشــر ‪ target‬يشــير إليهــا‬ ‫ودع المؤشر ‪ pred‬يشير إلى العقده التي قبلها ‪.End‬‬ ‫البحث عن الهدف في اللئحة المنغلقة‪:‬‬ ‫خوارزمية البحث ‪:‬‬ ‫إذا‬ ‫‪-1‬‬ ‫كانت اللئحة خاليه من العقد أعطى قيمة ‪ nil‬للمؤشرين ‪target.('Writeln(x.x:integer.data=x then‬‬ ‫‪Begin‬‬ ‫‪.target.next.pred:lptr‬‬ ‫‪Begin‬‬ ‫‪If head=nil then‬‬ ‫‪Begin‬‬ ‫‪.Target:=head^.newptr‬‬ ‫‪.(Add(head^.pred‬‬ ‫‪-2‬قارن بين الهدف والعقده الولى إذا كان الهدف يساوى العــدد فــي العقــده الولــى‬ ‫دع المؤشر ‪ target‬يشير إليها واجعل ‪ pred‬يشير إلى ‪nil‬‬ ‫إذا‬ ‫‪-3‬‬ ‫كان الهدف ل يساوى قيمة العدد في العقده الولى انتقل لمقارنته مع العقده التاليــة ‪.next^.'is not found‬‬ ‫‪.‬‬ ‫‪-4‬إذا كان الهدف ل يساوى قيمة الحقل)العدد( في العقده التالية كرر الخطوة )‪.Target:=head‬‬ ‫‪Pred:=nil‬‬ ‫‪End‬‬ ‫‪Else if head^.Pred:=nil‬‬ ‫‪End‬‬ ‫‪Else if head^.Target:=nil‬‬ ‫‪.(3‬‬ ‫إ‬ ‫‪-5‬‬ ‫ذا وصلت إلى نهاية اللئحة ولم تجد الهدف أعطى قيمة ‪ nil‬للمؤشرين‬ ‫‪.Pred:=head‬‬ ‫‪33‬‬ .

next.pred‬‬ ‫‪.target‬‬ ‫برنامج حذف عقده من لئحة منغلق ‪.1‬‬ ‫ل ‪.‬‬ ‫أ‪-‬دع المؤشر ‪ head‬يشير إلى العقده الثانية‪.x.End‬‬ ‫حذف عقده من اللئحة المنغلقة ‪.‬‬ ‫إذا‬ ‫‪-3‬‬ ‫كان المؤشر ‪ target‬ل يشير إلى ‪.target.‬‬ ‫‪.target.next^.2‬‬ ‫خدم الدالة ‪ dispose‬للغاء العقده المشار إليها بـ ‪.‫‪End‬‬ ‫‪Else if (x>head^.next‬‬ ‫اســـت‬ ‫‪.pred‬ل يشيران إلى ‪ nil‬اجر ما يلي‪.‬‬ ‫إذا‬ ‫‪-4‬‬ ‫كان المؤشران ‪ target.dispose‬‬ ‫خوارزمية حذف عقده من اللئحة المنغلقة‪:‬‬ ‫اســـت‬ ‫‪-1‬‬ ‫خدم برنامج البحث في تحديد قيم المؤشرين ‪.pred^.‬‬ ‫ب‪-‬استخدم الدالة ‪ dispose‬للغاء العقده الولى ‪.x:integer‬‬ ‫‪34‬‬ .'is not found‬‬ ‫‪.data)then‬‬ ‫‪Begin‬‬ ‫‪.‬‬ ‫اجع ـ‬ ‫‪.‬‬ ‫الغرض لوجود مؤشرين هو جعل المؤشر قبل العقده المراد حذفها يشــير إلــى نفــس‬ ‫المكان الذي يشير إليها مؤشر العقده المراد حذفها حتى يتسنى حــذف العقــده المــراد‬ ‫حذفها بالدالة ‪.pred‬‬ ‫إذا‬ ‫‪-2‬‬ ‫كان المؤشر ‪ target‬يشير إلى ‪ nil‬اطبع رسالة بعدم وجود العقده المراد حذفها‬ ‫‪.nil‬بينما المؤشر ‪ pred‬يشير إلى ‪ nil‬اجر ما‬ ‫يلي )وهذا يعنى أن العقده المراد حذفها هي العقده الولى (‪.next=target^.(Procedure delete(var head:lptr.('Writeln(x.Target:=nil‬‬ ‫‪.(Else search(head^.data)and(x<head^.Pred:=nil‬‬ ‫‪End‬‬ ‫‪.‬‬ ‫لحذف عقده في اللئحة نقوم بعملية البحث عن تلك العقده بالجراء ‪search‬‬ ‫التي ترجع مؤشرين واحده تشير إلى العقدة المراد حذفها والثانية تشير إلى مــا قبــل‬ ‫العقده المراد حذفها ‪.

‫اللئحة المنغلقة‬ :‫خوارزمية طباعة محتويات اللئحة المنغلقة‬ -:‫ اجر مايلى‬nil ‫ ل تساوى‬target ‫طالما أن المؤشر‬ .Pred^.x.head=head^.(Dispose(target End Else Begin .(Search(head.pred:lptr Begin .Var .End .target.next ‫اجعل‬.Target.1 .Head:=head^.next .pred ('If target=nil then writeln('this node is not found Else if (target=head)and(pred=nil)then Begin .next:=nil .(Dispose(target End Else if target^.nextr .next:=target^.head^.next=nil then Begin .(Procedure printlist(head:lptr Begin While head<>nil do Begin 35 .End :‫طباعة محتويات اللئحة المنغلقة‬ ‫عند الحوجة لسترجاع البيانات المحزنة نقوم بطباعة محتويات‬ .Pred^.2 ‫برنامج لطباعة محتويات اللئحة المنغلقة‬ .data ‫اطبع قيمة الـ‬.

next‬‬ ‫‪.End‬‬ ‫‪.(Writeln(head^.data‬‬ ‫‪.‬الترتيب الداخلي‪-:‬‬ ‫الترتيب بالفقاع ‪bubble sort‬‬ ‫‪-1‬‬ ‫الترتيب بالختيار ‪selection sort‬‬ ‫‪-2‬‬ ‫الترتيب بالدخال ‪insertion sort‬‬ ‫‪-3‬‬ ‫‪quick sort‬‬ ‫الترتيب السريع‬ ‫‪-4‬‬ ‫‪heap sort‬‬ ‫الترتيب المقيد‬ ‫‪-5‬‬ ‫‪shell sort‬‬ ‫الترتيب بالتجزئة‬ ‫‪-6‬‬ ‫ب‪.‬الترتيب الخارجي ‪-:‬‬ ‫وفيه نوع واحد وهو الترتيب بالدمج ‪merge sort‬‬ ‫‪36‬‬ .‫‪.End‬‬ ‫الترتيب الـ ‪Sort‬‬ ‫إذا كان لدينا مجموعة من العناصر في مصفوفة معينة فان هنالك طرق عديدة لترتيب هذه‬ ‫العناصر تصاعديا أو تنازليا‪.‬‬ ‫خوارزميات الترتيب‬ ‫أ‪.Head:=head^.

‬‬ ‫الترتيب بالفقاع ‪bubble sort‬‬ ‫في هذا النوع تطفو اصغر عناصر المصفوفة في أعلى المصفوفة‪.3‬كـــرر الخطـــوة) ‪ N-1 (2‬مـــرة حـــتى نصـــل لمقارنـــة العنصـــر الول مـــع الثـــاني‬ ‫‪ [A[1]<A[2‬وعندها تكون المصفوفة قد ترتبت‪.1‬كرر الخطوتين ‪2‬و ‪ 3‬بحيث ‪K= 1 TO N-1‬‬ ‫‪. [A[N‬‬ ‫‪.‬‬ ‫نفرض أن لدينا مصفوفة ‪ A‬وعدد عناصرها ‪ N‬في هذا النوع من الترتيب نتبع آلتي ‪-:‬‬ ‫‪.‬‬ ‫خوارزمية البحث بالفقاع‪-:‬‬ ‫‪.2‬اجعل ‪J=1‬‬ ‫‪.‬‬ ‫ب‪.1‬‬ ‫والشكل التالي يوضح لنا هذه الخطوات‪.4‬إنهاء التكرار في الخطوة ‪.5‬إنهاء التكرار في الخطوة ‪.‬اجعل ‪J=J+1‬‬ ‫‪.3‬‬ ‫‪.‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪]A[12]A‬‬ ‫‪5‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪2]A‬‬ ‫]‪1]A‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪2]A‬‬ ‫]‪1]A‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪2]A‬‬ ‫]‪1]A‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪2]A‬‬ ‫]‪1]A‬‬ ‫‪17‬‬ ‫‪17‬‬ ‫‪17‬‬ ‫‪37‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪12‬‬ ‫‪12‬‬ ‫‪17‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪8‬‬ ‫‪8‬‬ ‫‪[A[1‬‬ ‫‪[12‬‬ ‫‪A[1‬‬ ‫‪4‬‬ ‫‪[A[1‬‬ ‫‪5‬‬ ‫‪[A[1‬‬ ‫‪12‬‬ ‫‪8‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪7‬‬ ‫‪7‬‬ ‫‪7‬‬ ‫‪7‬‬ .3‬كرر الخطوتين أوب بحيث ‪J<=N-K‬‬ ‫إذا كان ‪ [A[J]>A[J+1‬بدل العنصرين مع بعض‪.2‬كرر الخطوة )‪ (1‬بحيث تنهى المقارنة عند العنصر قبل الخير وعنــدها يكــون هــو اكــبر‬ ‫عنصر في المصفوفة بعد العنصر ‪.1‬قارن العنصر الول مــع العنصــر الثــاني بحيــث نضــعه فــي الــترتيب ‪ [A[1]<A[2‬ثــم‬ ‫نقارن العنصر الثاني مع الثالث ونضعهم في الــترتيب ‪ [A[2]<A[3‬وتســتمر هــذه العمليــة‬ ‫حتى آخر عنصرين ‪ [A[N-1]<A[N‬وعند النتهاء من هذه الخطوة يكــون اكــبر عنصــر‬ ‫قد وضع في آخر ترتيب ‪.‫الهدف من تعدد الخوارزميات هي زيادة كفاءة البرامج‪. [A[N‬‬ ‫‪.

N=10 Var .A:array [1.([Read(a[I For k:=1 to n-1 do Begin .End For I:= 1 to n do .j.I.([Write(a[I .End The output .End .4 5 7 [A[1 8 12 17 .Program bubble Const .[A[j]:=a[j+1 .temp:integer Begin For I:=1 to n do The intering .k.A[j+1]:=temp The sorting .J: =j+1 .End ‫ من عمليات المقارنة وكذلك نحتاج إلى‬n*(n-1)/2 ‫في هذه الطريقة نحتاج إلى عدد‬ .J:=1 While j<=(n-k) do Begin If a[j]>a[j+1] then Begin .[Temp:=a[j .‫النصف من عمليات التبديل فبالتالي فان الترتيب بالفقاع غير فعال في عمليات الترتيب‬ 38 .n] of integer ..

‬‬ ‫‪[A[5 [A[6‬‬ ‫‪[A[3 [A[4‬‬ ‫‪[A[1 [A[2‬‬ ‫‪5‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫‪39‬‬ ‫]‪]A[12]A‬‬ ‫‪4‬‬ ‫‪17‬‬ ‫‪8‬‬ ‫‪[A[1‬‬ ‫‪12‬‬ ‫‪7‬‬ .‬‬ ‫الفكرة الساسية هو البحث عن اصغر عنصر في المصفوفة واستبدالها مع العنصر الول‬ ‫‪ [a[i‬ثم نبحث عن اصغر عنصر بين العناصر ‪ [a[2‬إلى ‪ [a[n‬ونقوم بتبديلها مع العنصر‬ ‫الثاني ‪ [a[2‬ثم نأخذ العناصر من ‪ [a[3‬إلى ‪ [a[n‬ونبحث عن أصغرها ونبدله مع ‪[a[3‬‬ ‫وهكذا حتى ننتهي من كل عناصر المصفوفة فنحصل على مصفوفة مرتبة‪.‫‪ selection sort‬الترتيب بالختيار‬ ‫لنفرض أن لدينا مجموعة من العداد عددها ‪ n‬ونريد أن نرتبها تصاعديا باستعمال‬ ‫الترتيب بالختيار‪.‬‬ ‫والشكل التالي يوضح لنا هذه الخطوات‪.

n:integer Var .Maxpostion:integer .maxpos:integer Begin .(Procedure selectsort(var table:array[1.End .10]of integer.n:integer):integer Var .Temp:integer Begin 40 .3 I=I+1 ‫اجعل‬..4 4 4 4 4 12 8 [A[1 17 7 5 ]A[12]A] 5 8 17 7 7 17 8 7 8 17 7 8 12 3]A] 4]A] 5]A] 6]A] 2]A] 3]A] 4]A] 5]A] 6]A] 12 1]A] 5 2]A] 12 1]A] 5 5]A] 6]A] 12 1]A] 5 3]A] 4]A] 2]A] 3]A] 4]A] 5]A] 6]A] 17 -:‫خوارزمية الترتيب بالختيار‬ I=1 ‫ضع‬. . [A[N ‫[ إلى‬A[I ‫ابحث عن اصغر عنصر من عناصر المصفوفة من‬2.(Procedure exchange(var x.2 ‫اذهب إلى‬ .Maxpos:=1 For I:=2 to n do .5 .4 ‫ عدد عناصر المصفوفة فان المصفوفة تكون قد رتبت وآل‬N ‫ حيث‬I=N ‫إذا كان‬..1 .I.10]of integer.y:integer Var .Findmaxpos:=maxpos .If table[I]>table[maxpos] then maxpos:=I .[A[I ‫قم بتبديل العنصر الصغر مع‬.Function findmaxpos(var table:array[1.

.(Selectsort(table.{for .N1=100 Type .([Exchange(table[maxpostion]..j.Temp:=x .I.A[k]:=s .K:=I .End 41 .K:=j .X:=y .End -:‫البرنامج بطريقة أخرى‬ Const .End .Y:=temp .[S:=a[j For I :=j+1 to n do Begin If a[I]<s then Begin .X=array[1.End Begin If n>1 then Begin .End {End.n .n-1 .(Procedure selectsort(var a:x.n1]of integer .s.table[n .[A[j]:=a[k .[S:=a[j .(Maxpostion:=finmaxpos(table.n:integer Var .k:integer Begin For j:=1 to n-1 do Begin .[S:=a[I .

‬‬ ‫الشكل التي يوضح هذه الطريقة ‪:‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫‪42‬‬ ‫]‪]A[12]A‬‬ .{end of procedure‬‬ ‫الترتيب بالدخال ‪Insertion sort‬‬ ‫ل بالبحث عن أصغر‬ ‫هذه الطريقة تختصر جزء من عمل طريقة الترتيب بالختيار فنقوم أو ً‬ ‫عنصر في المصفوفة ونحتفظ به في متغير آخر ثم نقوم بإزاحة للعناصر ‪ [A[1‬وحتى‬ ‫العنصر الذي يقع قبل مكان العنصر الصغر الذي وجدناه ‪ ،‬فيتقدم كل عنصر خطوة للمام‬ ‫ونضع العنصر الصغر في ‪ ، [A[1‬ثم نكرر العملية السابقة آخذين العناصر من ‪[A[2‬‬ ‫وحتى آخر عنصر في المصفوفة ‪.‫‪{End.

10]of .7 4 4 4 12 8 17 4 5 ]A[12]A] 7 5 5 12 7 7 8 12 8 17 8 12 3]A] 4]A] 5]A] 6]A] 5 1]A] 2]A] 3]A] 4]A] 5]A] 6]A] 1]A] 2]A] 3]A] 4]A] 5]A] 6]A] 17 17 -: ‫خوارزمية الترتيب بالدخال‬ .nextval:integer.10]of integer.(Procedure insertsort(var table:array[1. I=1 ‫ضع‬ -1 ...Nextpos:=nextpos-1 43 . X ‫العنصر الصغر يساوي‬ -3 ‫[ وحتى العنصر الذي يقع قبل مكان‬A[i ‫أعمل إزاحة لجميع العناصر من‬ -4 . I=I+1 ‫ضع‬ -6 .nextpos. A[i]=X ‫ضع‬ -5 .(.newpos. 2 ‫ فإن المصفوفة قد رتبت وإل أذهب إلى الخطوة‬I=N ‫إذا كان‬ -7 ‫برنامج الترتيب بالدخال‬ .var newpos:integer Begin While(nextpos>2)and(table[nextpos-1]>nextval)do Begin .Nextpos. [A[n ‫[ إلى‬A[i ‫أبحث عن أصغر عنصر من عناصر المصفوفة من‬ -2 .n:integer Var . ‫العنصر الصغر بتقديم كل منه خطوة للمام‬ .[Table[nextpos]:=table[nextpos-1 . nextval:integer Procedure shiftbigger(var table:array[1.integer.

‫ إلى اثنين‬partition ‫ يتم تقسيم آلـ‬last ‫ اصغر من‬first ‫إذا كان آلـ‬ 44  .nextpos.{end of procedure shift {Begin{begin of insertsort For nextpos:=2 to n do Begin {Nextval:=table[nextpos].End quick sort ‫الترتيب السريع‬ ‫ هو عبارة عن ترتيب يقوم بتقسيم العداد المراد ترتيبها إلى‬ ‫فيضع الرقام اقل‬.{save next element .End If table[1]>nextval then Begin . ‫ ويقارن به‬first ‫قسمين ثم يختار أحد المواقع يسمي‬ ..(Shiftbigger[table. ‫ والرقام الكبر منه يمينه‬first ‫ إلى يسار آلـ‬first ‫من الـ‬ ‫ موقع أول عنصر‬first  ‫ موقع آخر عنصر‬Last  ‫ موقع اقل عنصر‬Loc  -:‫الخوارزمية‬ last ‫ و‬first ‫ و‬x ‫ له متغيرات عبارة عن‬Quick sort ‫إجراء باسم‬.nextval.End .Newpos:=nextpos {End.newpos .[Table[2]:=table[1 .Table[newpos]:=nextval .Newpos:=1 End Else . .

loc-1 . last:integer Begin If (first <last) then Begin . first. first.I: =first .Pivot. first .I: =I + 1 Until x [i] >= Pivot repeat .(Partion (x. loc . last . last.[Pivot: =x [first While I < loc do BEGIN repeat .END -:partition ‫الجراء‬ . first .(procedure partition(var x:art. last:integer. var loc:integer Var .(Procedure quick_sort (var x: art .Ioc: =loc-1 45 .Loc: =last + 1 .‫تتميز هذه الطريقة بالداء الفضل مقرنة مع الترتيب بالختيار أو الترتيب بالدخال‬ (O(n log2 n ‫حيث يمكن حساب زمن تنفيذ البرنامج للترتيب السريع بالقانون‬ ‫بينما يتم حساب زمن تنفيذ البرنامج للترتيب الترتيب بالختيار أو الترتيب بالدخال‬ ‫بالقانون‬ (O(N2 _:‫ فان الزمن بالترتيب الختياري تحسب كالتي‬32 ‫تساوى‬N ‫مثل إذا كان قيمة الـ‬ 2 N =322=1024 ‫بينما الزمن بالترتيب السريع تحسب كالتي‬ N log2 n=32 log2 32=160 -:‫إجراء الترتيب السريع‬ . i: integer Begin . loc + 1.(Quick_sort (x.(Quick_sort (x.

Until x [loc] <= Pivot If I < loc then .Program exchangesort Const .File1.max]of string Var . x[first .( [Swap (x [loc].file2:text Begin .Name:list .Choice:boolean .‫ثم كتابتها في ملف آخر‬ .‫البرنامج في الصفحة التالية‬ ..Temp:string .List=array[1. x [I .I.('Assign(file2.dat .END .Max=100 Type . type ‫ هي عبارة عن مصفوفة تم تعريفها في منطقة الـ‬Art -:‫مثال‬ ‫اكتب برنامج يقرا قائمة من السماء ويقوم بترتيب هذه السماء حسب الترتيب الهجائي لها‬ .(Rewrite(file2 46 .'c:\dataout.END .dat .j:integer .( [Swap (x [loc] .('Assign(file1.(Reset(file1 .'c:\datain.

Choice:=true For j:=1 to i-1 do If name[j]>name[j-1] then Begin .[Name[j]:=name[j+1 .End 47 .Name[j+1]:=temp .I:=0 Repeat .(Close(file2 .End .(Close(file1 .I:=i+1 .name[i .Until choice For j:=1 to i do .name[j .(Until eof(file1 Repeat .([Readln(file1.([Writeln(file2.Choice:=false ..[Temp:=name[j .

‫البحث الخطي ‪Search‬‬ ‫البحث الخطى يبحث في مصفوفة غير مرتبة‪. Loc‬‬ ‫مثال توضيحي ‪:‬‬ ‫‪3‬‬ ‫أبحث عن الرقم ‪3‬‬ ‫‪1‬‬ ‫‪8‬‬ ‫الرقم ‪ 3‬موجود في الموقع الثاني‬ ‫‪3‬‬ ‫‪48‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪A‬‬ ‫= ‪N + 1 = 4 ⇒N‬‬ . Loc = 1‬‬ ‫‪ -3‬كرر أ و ب بحيث ≠ ]‪item A[Loc‬‬ ‫‪Loc = Loc + 1 -1‬‬ ‫‪ -2‬أنهي التكرار‬ ‫‪ -4‬إذا كان ‪ Loc = N + 1‬أظهر رسالة بعدم وجود العنصر و إل اكتب‬ ‫موقع العنصر وهو الـ ‪.‬‬ ‫ةةةةةةةةةة ‪:‬‬ ‫‪ -1‬أضف العنصر المراد البحث عنه )‪ (item‬إلى نهاية المصفوفة‬ ‫‪A[N+1]=item‬‬ ‫‪ -2‬أجعل ‪.‬‬ ‫أبحث في المصفوفة إذا وجدنا العنصر نحدد موقعه وإل نعطي‬ ‫رسالة بعدم وجوده‪.

‫‪1‬‬ ‫‪8‬‬ ‫‪3‬‬ ‫‪13‬‬ ‫‪3‬‬ ‫‪Loc=1‬‬ ‫‪A[Loc] ≠ item ⇒ A[1] ≠ 3 ⇒ 13 ≠ 3‬‬ ‫‪Loc 2‬‬ ‫‪A[Loc] ≠ item ⇒ A[2] = 3 ⇒ 3 = 3‬‬ ‫إذن الـ ‪ 3‬موجود في الموقع الثاني‪..‬‬ ‫‪4‬‬ ‫أبحث عن الرقم ‪30‬‬ ‫‪3‬‬ ‫‪0‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪8‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪A[Loc] ≠ item‬‬ ‫‪( A[1] ≠ 30 ) ⇒ ( 13 ≠ 30) ⇒True‬‬ ‫‪A[2] ≠ item‬‬ ‫‪( 3 ≠ 30) ⇒ True‬‬ ‫‪A[3] ≠ item‬‬ ‫‪(18 ≠ 30) ⇒ True‬‬ ‫‪A[4] ≠ item‬‬ ‫‪(30 ≠ 30) ⇒ False‬‬ ‫‪A‬‬ ‫‪Loc‬‬ ‫‪1‬‬ ‫‪Loc‬‬ ‫‪2‬‬ ‫‪Loc‬‬ ‫‪3‬‬ ‫‪Loc‬‬ ‫‪4‬‬ ‫* إذا كان ‪ Loc = N+1‬اظهر رسالة بعدم وجود العنصر و إل اكتب‬ ‫موقع العنصر وهو الـ ‪ Loc‬وهنا تحقق الشرط لذلك تطبع رسالة بعدم وجود العنصر‬ ‫‪.10] of integer‬‬ ‫‪49‬‬ . A : array [1.m=10‬‬ ‫‪var‬‬ ‫‪.30‬‬ ‫‪. program test‬‬ ‫‪const‬‬ ‫‪.

([Readln(A[I . Loc . N .End (‫البحث في مصفوفة مرتبة )البحث الثنائي‬ ‫نلخص هذه الطريقة في اننا نقوم فــي كــل مرحلــة مــن مراحــل‬ ‫البحث بمقارنة الهدف المراد البحث عنه مع العنصر الوســط اذا كانــا‬ 50 . A[N+1]:= item . (’Writeln (‘enter your item . N:= m-1 For I:= 1 to N do Begin .Loc := Loc + 1 . item : integer Begin .Loc . I ..Loc:=1 While A[Loc] <> item do Begin . Readln . End .I . End If loc=n+1 then (’Writeln(‘item is not found else (Write (‘item Loc = ‘.(Readln(item . (’[’.Writeln (‘enter A[‘.

‫متساويين يكون قد تحدد موقع العنصر المراد البحث عنه ‪ . (1‬‬ ‫‪ -5‬إذا كان العنصر الوسط اصغر من الهدف فأبحث في المصفوفة‬ ‫الجزئية ذات المؤشرات الدليلية من )العنصر الوسط ‪ (1 +‬إلى‬ ‫العنصر الخير ‪.‬‬ ‫‪ -4‬إذا كان العنصر الوسط اكبر من الهدف ابحث في المصفوفة‬ ‫الجزئية ذات المؤشرات الدليلية من العنصر الول إلى )العنصر‬ ‫الوسط – ‪.‬اما اذا كان‬ ‫العنصر الوســط اكــبر مــن الهــدف فيجــب علينــا البحــث فــي النصــف‬ ‫السفل للمصفوفة اما اذا كان العنصر الوســط اصــغر مــن الصــفوفة‬ ‫فيجب البحث في النصف العلى فــي المصــفوفة نكــرر هــذه العمليــة‬ ‫بالنسبة للنصف السفل والنصف العلــى ونتعامــل معــه كمــا لــو كــان‬ ‫مصفوفة قائمة بذاتها حتى نجد الهدف او ينتهي البحث في حالة عــدم‬ ‫عثورنا على الهدف ‪.‬‬ ‫الخوارزمية ‪:‬‬ ‫‪ -1‬احسب قيمة المؤشر الدليلي للعنصر الوسط ‪.‬‬ ‫مثال توضيحي ‪:‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪9‬‬ ‫‪9‬‬ ‫‪9‬‬ ‫‪0‬‬ ‫‪4‬‬ ‫‪0‬‬ ‫‪3‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫الخير‬ ‫الول‬ ‫‪51‬‬ ‫‪3‬‬ ‫‪9‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪A‬‬ .‬‬ ‫‪ -2‬إذا كانت أطراف المصفوفة غير صالحة ) العنصر الول اكبر من‬ ‫العنصر الخير ( ارجع النتيجة أو رسالة لعدم صلح المصفوفة‬ ‫للبحث ‪.‬‬ ‫‪ -3‬إذا كان العنصر الوسط مساويا ً للهدف ارجع قيمة المؤشر‬ ‫الدليلي للعنصر الوسط ‪.

var I.10] of integer .33 ‫ابحث عن العنصر‬ :‫الحل‬ (1+ 8)2/= 4 ‫الموقع الوسط‬ target = 33 false IF(A[4] = target) ⇒ [21≠ A[4 = 33 A 5 6 7 8 3 3 4 0 9 0 9 ‫ فى المصفوفة‬33 ‫أبحث عن الرقم‬ 9 ‫الخير‬ ‫الول‬ )5 + 8 2/(= (false A 6 ‫الموقع الوسط‬ ⇒ IF( A[6] = 33 A[6]= 40 ≠ 33 5 6 3 3 4 ‫ فى المصفوفة‬33 ‫أبحث عن الرقم‬ 0 ‫الخير‬ ‫الول‬ )5 + 6 2/(= 5 ‫الموقع الوسط‬ (True ⇒ IF( A[5] = 33 A[5]= 33 5 ‫ موجود في الموقع‬33 ‫العنصر‬ . Function binsearch(var A:data . A : data .2/‫ الموقع الخير‬+ ‫الموقع الوسط = الموقع الول‬ :‫مثال‬ . Begin First := 1. 52 . Var Last. target : integer) : integer . Midd : integer .. B. target : integer . program test2 type data = array[1. First.

.Maxstack=100 Type Stack=record . Write (‘target = ‘. If A[Midd] > target then Last := Midd – 1 Else First := Midd + 1 .Top:0.Item:array[1. Begin For I := 1 to 10 do Begin Writeln (‘enter A[‘.B) . If A[Midd] = target then Binsearch := Midd Else Binsearch := 0.End Var . Readln (target) . End . Readln (A[I]) .maxstack .I.maxstack]of integer . End. Readln . End . Writeln (‘enter target : ‘) . Until (First = Last) or (A[Midd] = target). Stack Using Array type Const . Repeat Midd := (First + Last) div 2 ..Last := 10.’]’) .target) .S:stack 53 . B:= Binsearch (A.

top:=s.function pop(var s:stack):integer begin ('if empty(s) then write('stack is empty else begin .end .top-1 54 .s.top=maxstack then full:=true else .[pop:= s.s.x:integer begin ('if full(s) then write('stack is full else begin .top=0 then empty:=true else .(Procedure initialize(var s:stack Begin .full:=false .top]:=x .s..top:=0 .item[s.function full(s:stack):Boolean begin if s.end .empty:=false .top .top+1 .end .end .(procedure push(var s:stack.end .s.I:integer .top:=s.item[s.function empty(s:stack):Boolean begin if s.

item[s.End begin .end Stack Using Pointer ‫المكدسة باستخدام المؤشرات‬ ..Next:stack .2 .end .x:integer 55 .top downto 1 do .S:stack .function stacktop(s:stack):integer begin ('if empty(s) then write('stack is empty else .Item: integer .(' '.(procedure display(s:stack var .top .5 .Stack=^data Data=record .[stacktop:=s.(push(s.[Write(s.7 .I:integer Begin For I:= s.end .(push(s.end .item[I .End Var .3 .(initialize(s .readln .(push(s.(push(s.(display(s .Uses crt Type .

p^item:=x .empty:=false .next (dispose(p .p:stack begin if empty(st) then begin .x:integer .end 56 .end .item .pop:=0 .end .end .St:=nil .('write('stack is empty end else begin .function pop(var st:stack):integer var .p:=st .end .next:=st .(Procedure initialize(var st:stack Begin .(new(p .p^..end .function empty(st:stack):Boolean begin if st=nil then empty:=true else .st:=st^.p:stack begin .(procedure push(var st:stack.st:=p .pop:= st^.

next .stacktop:=st^.St:=st^.(push(s..10]of integer .Uses crt Const .Rear.(initialize(s .(display(s .readln ..item .(push(s.(push(s.function stacktop(st:stack):integer begin ('if empty(st) then write('stack is empty else .End begin .3 .7 .end Linear Queue Using Array : ‫الصف الخطى‬ front=1 ‫ و‬rear=0 ‫الحالة البتدائية‬ .item .End Var 57 .(procedure display(st:stack Begin While st<>nil do Begin .(push(s.Item:array[1.Maxqueue=10 Type Queue=record .2 .front:integer .(Write(st^.5 .end .

;Q:queue
;I:integer
;(Procedure initialize(var Q:queue
Begin
;q.rear:=0
;q.front:=1
;end
;function full(q:queue):Boolean
begin
;full:=q.rear=maxqueue
;end
;function empty(q:queue):Boolean
begin
;(empty:=(q.front=1)and(q.rear=0
;end
;(procedure push(var q:queue;x:integer
begin
('if full(q) then write('queue is full
else
begin
;q.rear:=q.rear+1
;q.item[q.rear]:=x
;end
;end
;function delete(var q:queue):integer
begin
('if empty(q) then write('queue is empty
else
begin
;[delete:= q.item[q.front
;q.front:=q.front+1
;end
58

‫‪;end‬‬
‫‪;(procedure display(q:queue‬‬
‫‪var‬‬
‫‪;I:integer‬‬
‫‪Begin‬‬
‫‪For I:= q.rear to q.front do‬‬
‫‪;(' ',[Write(q.item[I‬‬
‫‪;End‬‬
‫‪Begin‬‬
‫‪;(Initialize(q‬‬
‫‪For I:=1 to 4 do‬‬
‫‪;(Insert(q,i‬‬
‫‪;(Display(q‬‬
‫‪;Readln‬‬
‫‪.End‬‬

‫الشجرة ‪tree‬‬
‫هنالك نوع من بنيات البيانات ترتبط فيمـا بينهـا عـن طريـق فـروع ‪ ،branches‬أي‬
‫أنها ل تعتمد على التركيب الخطى في تكوينها ‪ ،‬فليس بالضــرورة أن يرتبــط العنصــر فيهــا‬
‫بعنصر واحد أمامه وعنصر واحد خلفه ‪.‬‬
‫تعريف الشجرة ‪-:‬‬

‫الشجرة هي مجموع محدده ‪ ،‬تتكون من عقده واحده أو اكثر بحيث ‪:‬‬
‫توجد بها عقده مصممه بشكل خاص تسمى الجذر ‪. root‬‬
‫‪.1‬‬
‫العقدة الباقية مقسمه إلــى ‪ n>=0‬مــن المجموعــة ‪tl..tn‬المنفصــلة بحيــث كــل‬
‫‪.2‬‬
‫واحده من هــذه المجموعــات تكــون شــجره ‪ th..tn‬تســمى شــجيرات ‪ subtrees‬مــن‬
‫الجذر‪.‬‬

‫‪59‬‬

‫إن الشجرة ا لسابقه بها ‪ 13‬عقده ‪ Node‬يحتــوى عنصــر البيانــات فــي شــكل عقــده‬
‫على حرف‪ .‬جذر هذه الشجرة هي العقدة التي يحتوى عنصر البيانات فيها علــى حــرف ‪A‬‬
‫لحظ إننا رسمنا الشجرة وجذرها إلي أعلى ‪ ،‬وهذا هو النهج المتبع في رســم الشــجار ‪ .‬إن‬
‫عدد الشجيرات التي تتفرع من عقـده مـا يسـمى درجـة العقـدة ‪ degree of node‬فدرجـة‬
‫العقدة التي تحتوى على ‪ a‬هي ‪3‬بينما درج العقدة التي تحتوى علــى الحــرف ‪ c‬هــي ‪ ، 1‬أمــا‬
‫درجة العقدة ‪ k‬فهي صفر أن العقدة التي تكون درجتها مساويه تسمى ورقــة ‪ leaf‬أو العقــدة‬
‫النهائية ‪ terminal node‬بناء على مــا ســبق فــان }‪ {k,l,g,m,I,j‬هــي مجمــوعه العقــد‬
‫الورقيــة ‪ ،‬وبعكــس ذلــك فــان العقــد الــتي درجتهــا لتســاوى الصــفر تســمى عقــدَا داخليــة‬
‫‪ nonterminal node‬ما عدا الجذر ‪.‬‬
‫إن جذر الشجيرات التي تتفرع من عقده ما ولتكن ‪ x‬تسمى أبنــاء ‪ children‬لـــــــ ـ‬
‫‪ x‬و ‪ x‬تسمى أبناء ‪ parent‬لهؤلء البناء وبالنظر إلى الشجرة الســابقة نلحــظ إن أبنــاء ‪d‬‬
‫هم ‪ j,I,h‬وأب ‪ d‬هو ‪. a‬‬
‫إن أبناء الب الواحد يسمون أشقاء ‪ siblings‬وبذلك فــان ‪ j,i,h‬هــم أشــقاء لن لهــم نفــس‬
‫الب ‪. d‬‬
‫درجة الشجرة ‪-: degree of tree‬‬
‫هي أعلى درجه للعقده في الشجرة وبالتالي فان درجة الشجرة السابقة هي ‪. 3‬‬
‫مستوى العقدة ‪-: level of tree‬‬
‫إذا قلنا إن عقدة ما في المستوى ‪ L‬فان أبناءها سوف يكونون في المســتوى ‪، L+1‬‬
‫فإذا افترضنا أن الجذر يقع في المستوى ‪ 1‬فان البن ‪ d‬يقع في المستوى ‪. 2‬‬
‫ارتفاع الشجرة ‪-:height of tree‬‬
‫هو أعلى مستوى يمكن أن تأخذها عقده في الشجرة ‪ ،‬يكون ارتفاع الشجرة السابقة هو ‪. 3‬‬
‫الغابة ‪-: forest‬‬
‫هي مجموعه بها عدد ‪ n>=0‬مــن الشــجار المنفصــلة عــن بعضــها ‪ .‬لحــظ أننــا إذا‬
‫أزلنا جذر الشجرة فإننا سوف نحصل على غابه على سـبيل المثـال فـي الشـجرة السـابقة إذا‬
‫أزلنا ‪ a‬سوف نحصل على غابه مكونه من ثلثة أشجار ‪.‬‬
‫الشجار الثنائية ‪-: binary tree‬‬
‫‪60‬‬

‬المثــال التــالي يوضــح شــكل شــجرة‬ ‫البحث الثنائية‪:‬‬ ‫‪61‬‬ .‬وهى تتصف بــان أي‬ ‫عقده فيها يمكن أن يكون لديها على الكثر فرعان ‪ ،‬أي انه ل توجد بها عقده درجتهــا اكــبر‬ ‫من ‪ 2‬في الشجار الثنائية فإننا نميز بين الشجرة اليمنى والشجرة اليسرى للعقده الواحدة ‪.‬‬ ‫لحظ أن هذا التعريف هو تعريف مجرد ولتحديد الشجرة الثنائية كنوع مــن أنــواع البيانــات‬ ‫المجردة ‪ ،‬يجب علينا أن نوضح ما هي العمليات التي يمكن أن تجــرى علــى الشــجرة علــى‬ ‫الشجرة الثنائية ‪ .‬‬ ‫تعريف‪-:‬‬ ‫الشجرة الثنائية هي مجموعه محدودة من العقد ‪ ،‬وهذه المجموعــة أمــا أن تكــون خــاليه ‪ ،‬أو‬ ‫أنها تحتوى على جــذر وشــجيرتين علــى الكــثر منفصــلتين تســميان الشــجرة اليســرى ‪left‬‬ ‫‪ sudtree‬والشجرة اليمنى ‪ right sudtree‬هاتــان الشــجيرتان متصــلتان بالجــذر ‪ ،‬وكــل‬ ‫منهما تمثل شجرة ‪.‬‬ ‫مفتاح العقدة في الجذر مــن كـل المفاتيــح ) أن وجـد( فـي الشــجرة اليمنــى ‪ .‬‬ ‫أن الشجار الثنائية تستخدم لعدة أغراض من ضمنها البحث ‪ .‬وسوف نستعرض فــي الفقــرة‬ ‫التأليه نوع من أنواع ال شجار الثنائية في عمليات البحث والترتيب ‪.‬لحظ أيضا أن هذا التعريف لم يبين لنا طريقة العقد داخل الشجرة ‪.‫تعتبر الشجار الثنائية من النواع المهمة في بنيات الشجار ‪ .‬‬ ‫شجرة البحث الثنائية‬ ‫‪binary search tree‬‬ ‫هي شجرة ثنائية ‪ ،‬والتي آما أن تكون خاليه أو كــل عقــده منهــا تحتــوى علــى مفتــاح‬ ‫يحقق الشروط التالية ‪:‬‬ ‫كل المفاتيح ) أن وجدت ( في الشجيرة اليسرى ‪،‬اصغر من مفتاح العقدة في الجذر ‪.‬الشــجرة اليمنــى‬ ‫والشجرة اليسرى تنطبق عليهما نفر الشروط الســابقة ‪ .

Info : integer‬‬ ‫‪.‪left:=nil‬‬ ‫‪62‬‬ .‬‬ ‫‪Type‬‬ ‫‪.root=nil‬‬ ‫كل عقــده فــي شـجرة البحــث الثنائيــة لهـا شــجيرة يمنــى وشـجيرة يسـرى ‪ ،‬وهــذا مــا يمكـن‬ ‫الحصول عليه باستعمال المؤشرات في هذا الجزء من البرنامج ‪. right:p‬‬ ‫‪.‪info:=r‬‬ ‫.‪function creatptr(r:integer):p‬‬ ‫‪var‬‬ ‫.‬‬ ‫.)‪new(ptr‬‬ ‫‪with ptr^ do‬‬ ‫‪begin‬‬ ‫.P=^nodetype‬‬ ‫‪Nodetype=recod‬‬ ‫‪.‫نلحظ أن اكبر المفاتيح التي تقع في الشجرة اليمنى المتصلة بالجذر ‪ 5‬هي اكبر من ‪ ،5‬وان‬ ‫كل المفاتيح التي تقع في الشجرة اليسرى المتصلة بالجذر ‪ ، 5‬هي اصــغر مــن ‪ ،5‬وذلــك أو‬ ‫آخذنا كل شجرة من الشجيرتين )‪T (2‬و ‪ (T (7‬فإننا سوف نلحظ نفس الملحظة لتســهيل‬ ‫التعامل مع الشــجيرة فإننــا ســوف نســتخدم بنيــة بيانــات متحركــة لتمثيلهــا ‪ ،‬ســوف نســتخدم‬ ‫المتغير مؤشر ليدلنا على مكان الشجرة أن السم المعتاد لذلك المؤشــر هــوا لــ ـ ‪ Root‬لنــه‬ ‫سوف يشير إلى جذر الشجرة‬ ‫إذا كان الشجرة خاليه فان ‪.Root:p‬‬ ‫إنشاء عقده شجرة‪:‬‬ ‫الدالــة التاليــة توضــح لنــا كيفيــه إنشــاء عقــده تمهيــدَا لضــافتها إلــى شــجره البحــث‬ ‫الثنائية‪،‬حيث يتم إنشاء مؤشر باستخدام الدالة ‪ ، new‬والذي يشير إلــى ســجل يحتــوى علــى‬ ‫ثلثة حقول ‪ ،‬اثنين مهما عبارة عــن مؤشــرات ‪ ،‬الثــالث مــن النــوع ‪ integer‬ليخــزن بــداله‬ ‫المفتاح ‪.Left.End‬‬ ‫‪Var‬‬ ‫‪.‪ptr:p‬‬ ‫‪begin‬‬ ‫.

pt1:p‬‬ ‫‪begin‬‬ ‫‪if pt=nil then‬‬ ‫‪pt:=pt1‬‬ ‫‪else‬‬ ‫‪if ptr^.‪end‬‬ ‫.info < pt^.info then‬‬ ‫)‪add(pt^.‪creatptr:=ptr‬‬ ‫.)‪procedure add(var pt.left. pt‬‬ ‫.‪end‬‬ ‫إضافة عقده إلى شجرة البحث الثنائية ‪-:‬‬ ‫لنفرض إننا نريد آن نضيف عقده إلى شجرة البحث الثنائيــة الــتي فــي المثــال الســابق ‪ ،‬هــذه‬ ‫العقدة تحتوى على المفتاح ‪ ،3‬فنبدأ أول بمقارنــة ‪ 3‬مــع مفتــاح الجــذر ‪ 5‬نجــد أن ‪ 5>3‬الن‬ ‫ننتقل آلي الشجرة اليسرى للجذر نلحظ أن جذرها يحتوى على المفتاح ‪ 2‬والذي هو اصغر‬ ‫من ‪ ،3‬لذلك نتجه الن آلي الشــجرة اليمنـى ‪ ،‬نجـد أن المفتـاح قيمتـه ‪ ،4‬وهــو اكــبر مــن ‪،3‬‬ ‫ولن المؤشر اليسر لهذه العقدة يشير إلى ‪ ، nil‬لتصبح الشجرة كالتي ‪:‬‬ ‫‪ :‬إضافة عقده إلى شجرة البحث الثنائية‬‫البرنامج التالي يستخدم للنداء التكراري لضافة العقدة المشار إليها بالمؤشر ‪ ptl‬إلى‬ ‫الشجرة المشار إلى جذرها بالمؤشر ‪.ptr‬‬ ‫.)‪add(pt^.‫.‪right:=nil‬‬ ‫.‪end‬‬ ‫‪63‬‬ .ptr‬‬ ‫‪else‬‬ ‫.right.

z‬‬ ‫‪else‬‬ ‫.)‪search:=search(pt^.’is not fuond‬‬ ‫.‪function search(pt:p.‬‬ ‫في الشكل أدناه لنفرض أننا نريد حذف العقدة التي تحتوى على المفتــاح ‪،2‬‬ ‫فكل الذي علينا عمله هو أن نرفع الشجرة اليسرى مكان العقدة ‪ ،2‬ونجعــل العقــدة‬ ‫اليســار للعقــده المــراد حــذفها ‪ 2‬تتصــل بالعقــدة الــتي تقــع أقصــى اليميـن الســفلي‬ ‫للشجيرة ‪ 4‬ويصبح الشكل عندنا كالتي ‪--:‬‬ ‫‪64‬‬ .‪search:=nil‬‬ ‫‪end‬‬ ‫‪else‬‬ ‫‪if pt^.)' ‪writeln(Z.‬‬ ‫.right.z‬‬ ‫.info = z then search:=pt‬‬ ‫‪else‬‬ ‫)‪if z<pt^.‫‪ :‬البحث عن مفتاح في شجرة البحث الثنائية‬‫البرنامج التالي يوضح طريقة استخدام النداء التكراري في البحث عن مفتــاح ‪ Z‬فــي شــجرة‬ ‫بحث ثنائية مشار إلى العقدة آلتي تحتوى على المفتاح في حالة وجوده ‪ ،‬ويؤشر إلى ‪ nil‬في‬ ‫حالة عدم وجود المفتاح ‪. z:integer) :p‬‬ ‫‪begin‬‬ ‫‪if pt=nil then‬‬ ‫‪begin‬‬ ‫.info then search:=search(pt^.‪end‬‬ ‫حذف عقدة من شجرة البحث الثنائية ‪-:‬‬ ‫إذا كانت العقدة المراد حذفها من الشجرة عبارة عــن ورقــه فــان المــر فــي‬ ‫غاية السهولة كما هو موضح في الرسم ‪ ،‬حيـث حـذف العقـدة الـتي تحتـوى علـى‬ ‫المفتاح )‪ (3‬أما إذا كانت هذه العقدة لديها شجيرتان يمنى ويسرى فان المر يبــدو‬ ‫معقدَا بعض الشيء ‪.left.

info =k then begin 65 . var found:boolean.info > k then delete(root^.right. begin if root^. var temp:p.left^.info) then begin if root^.k:integer).k) else delete(root^. if (found) and (k<>root^.found.left.: ‫كما هو موضح في الشكل التالي‬ .info=k then found:=true else if root^.found.‫ من الشكل أعله فالــذي يجــب عملــه هــو أن‬7 ‫الن لنفرض أننا نريد حذف العقدة‬ 8 ‫نرفع العقدة‬ (8) ‫ عبارة عن شجيرة يســرى للمفتــاح‬6 ‫)العقدة اليمنى ( إلي أعلى وتكون العقدة‬ .k) .: ‫البرنامج التالي يوضح طريقة الحذف‬ procedure delete (root:p.

root:p. left.right:p. end . dispose(temp). begin new(ptr). if temp^.temp^. left:=nil. function creatptr(r:integer):p.left:=temp^. var ptr:p.left. TYPE p=^node. newptr . var ptr. right:=nil. end. node=record info:integer. root^.temp:=root^. end.right <> nil then add(root. root^. found:=false.left.left. end else begin temp:=root^. 66 .right).right:=temp^. end. end. with ptr^ do begin info:=r.right.

var temp:p. z:integer) :p.info = z then search:=pt else if z<pt^.z). procedure delet (root:p. end.ptr:p).k:integer).k) . begin if pt=nil then pt:=ptr else if ptr^. function search(pt:p. end.found.right.creatptr:=ptr.left.info > k then delet(root^.info then search:=search(pt^.info=k then found:=true else if root^. end.left.’is not fuond ').info < pt^. end else if pt^.info) then begin if root^.info =k then begin 67 .left.z) else search:=search(pt^.right.found.k) else delet(root^.right.ptr). begin if pt=nil then begin writeln(Z.ptr) else add(pt^. search:=nil. procedure add(var pt.left^. begin if root^. if (found) and (k<>root^. var found:boolean.info then add(pt^.

‫اطبع المحتويات قبل وبعد الحذف‬ 68 . end .right:=temp^. begin root:= new(ptr). end. newptr). dispose(temp).left:=temp^.left. if temp^. end.left. end else begin temp:=root^.‫_ادخل عشرة عقد بأسماء مختلفة‬ . ‫تمارين متنوعة‬ ‫ تحتوى عقدها على ثلثة حقول الول للسم والثاني‬linked list ‫اكتب برنامج لنشاء‬. for I:=1 to 10 do begin newptr:creatptr.right.temp:=root^. add(root. readln.right <> nil then add(root. end.5 ‫_احذف العقدة رقم‬ .* ‫للعمر والثالث مؤشر للعقدة التالية‬ .temp^.left. root^. end. {delete} . found:=false. root:=nil. root^.right).

‬‬ ‫‪69‬‬ . C‬‬ ‫_‪4‬قائمة بكل الوراق‪.‫*من الشكل السابق حدد التي‪-:‬‬ ‫‪_1‬ما هو الجذر ‪ROOT‬‬ ‫_‪2‬أبناء ‪ G‬إن وجدوا‪.G‬‬ ‫_‪6‬وزن الشجرة‪.‬‬ ‫‪_3‬المستوى لـ ‪.‬‬ ‫‪_7‬من هم الشقاء‪.‬‬ ‫‪_5‬ارسم الشجرة اليسرى للـ ‪.

Sign up to vote on this title
UsefulNot useful