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

‫الخوارزميات‬
‫تحليل الخوارزميات‪:‬‬
‫‪ -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‬‬

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

‫‪ selection sort‬الترتيب بالختيار‬ ‫لنفرض أن لدينا مجموعة من العداد عددها ‪ n‬ونريد أن نرتبها تصاعديا باستعمال‬ ‫الترتيب بالختيار‪.‬‬ ‫والشكل التالي يوضح لنا هذه الخطوات‪.‬‬ ‫الفكرة الساسية هو البحث عن اصغر عنصر في المصفوفة واستبدالها مع العنصر الول‬ ‫‪ [a[i‬ثم نبحث عن اصغر عنصر بين العناصر ‪ [a[2‬إلى ‪ [a[n‬ونقوم بتبديلها مع العنصر‬ ‫الثاني ‪ [a[2‬ثم نأخذ العناصر من ‪ [a[3‬إلى ‪ [a[n‬ونبحث عن أصغرها ونبدله مع ‪[a[3‬‬ ‫وهكذا حتى ننتهي من كل عناصر المصفوفة فنحصل على مصفوفة مرتبة‪.‬‬ ‫‪[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‬‬ .

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

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

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

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

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

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

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

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

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

30‬‬ ‫‪.10] of integer‬‬ ‫‪49‬‬ .‫‪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‬موجود في الموقع الثاني‪..m=10‬‬ ‫‪var‬‬ ‫‪.‬‬ ‫‪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‬وهنا تحقق الشرط لذلك تطبع رسالة بعدم وجود العنصر‬ ‫‪. program test‬‬ ‫‪const‬‬ ‫‪. A : array [1.

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

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

. target : integer . First. Begin First := 1.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 ‫العنصر‬ .2/‫ الموقع الخير‬+ ‫الموقع الوسط = الموقع الول‬ :‫مثال‬ . Function binsearch(var A:data . target : integer) : integer . B.10] of integer . A : data . program test2 type data = array[1. Midd : integer . var I. Var Last. 52 .

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

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

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

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

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

;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‬‬

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

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

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

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

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

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

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

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

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