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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

‬‬ ‫‪[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‬ونريد أن نرتبها تصاعديا باستعمال‬ ‫الترتيب بالختيار‪.‬‬ ‫والشكل التالي يوضح لنا هذه الخطوات‪.

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

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

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

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

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

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

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

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

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‬أجعل ‪.‫البحث الخطي ‪Search‬‬ ‫البحث الخطى يبحث في مصفوفة غير مرتبة‪. Loc = 1‬‬ ‫‪ -3‬كرر أ و ب بحيث ≠ ]‪item A[Loc‬‬ ‫‪Loc = Loc + 1 -1‬‬ ‫‪ -2‬أنهي التكرار‬ ‫‪ -4‬إذا كان ‪ Loc = N + 1‬أظهر رسالة بعدم وجود العنصر و إل اكتب‬ ‫موقع العنصر وهو الـ ‪.

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

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

‬اما اذا كان‬ ‫العنصر الوســط اكــبر مــن الهــدف فيجــب علينــا البحــث فــي النصــف‬ ‫السفل للمصفوفة اما اذا كان العنصر الوســط اصــغر مــن الصــفوفة‬ ‫فيجب البحث في النصف العلى فــي المصــفوفة نكــرر هــذه العمليــة‬ ‫بالنسبة للنصف السفل والنصف العلــى ونتعامــل معــه كمــا لــو كــان‬ ‫مصفوفة قائمة بذاتها حتى نجد الهدف او ينتهي البحث في حالة عــدم‬ ‫عثورنا على الهدف ‪.‬‬ ‫‪ -3‬إذا كان العنصر الوسط مساويا ً للهدف ارجع قيمة المؤشر‬ ‫الدليلي للعنصر الوسط ‪.‬‬ ‫الخوارزمية ‪:‬‬ ‫‪ -1‬احسب قيمة المؤشر الدليلي للعنصر الوسط ‪.‬‬ ‫‪ -4‬إذا كان العنصر الوسط اكبر من الهدف ابحث في المصفوفة‬ ‫الجزئية ذات المؤشرات الدليلية من العنصر الول إلى )العنصر‬ ‫الوسط – ‪.‫متساويين يكون قد تحدد موقع العنصر المراد البحث عنه ‪ .‬‬ ‫‪ -2‬إذا كانت أطراف المصفوفة غير صالحة ) العنصر الول اكبر من‬ ‫العنصر الخير ( ارجع النتيجة أو رسالة لعدم صلح المصفوفة‬ ‫للبحث ‪. (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‬‬ .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful