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

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

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

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

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

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

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

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

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

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

(eval:= pop(st . ( [ read ( arr [ position . ( [ write ( arr [ position .end -: ‫في التمرين السابق نجد‬ ‫ هي دالة اختبار هل الرمز المدخل رقم أم ل‬Op ‫الدالة‬ -1 False ‫ في حالة الرقم و‬true ‫حيث تقوم بإرجاع نتيجة منطقية‬ . ' ' =:ch . ‫خلف ذلك‬ : ‫ويمكن أن نكتب الدالة بالشكل التالي‬ .(opnd1:=pop(st .opnd1.((writeln('value of postfix is '.(' writeln(' original postfix expression is for position:=1 to maxarray do .('write('enter your postfix expression for i:= 1 to maxarray do .(value:=oper (ch.writeln .position:= position + 1 .eval(arr .[ ch:=arr [ position end else . 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 ..value end if position < maxarray then begin .opnd2 .end .(push(st. readln .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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‬أجعل ‪.‫البحث الخطي ‪Search‬‬ ‫البحث الخطى يبحث في مصفوفة غير مرتبة‪.‬‬ ‫أبحث في المصفوفة إذا وجدنا العنصر نحدد موقعه وإل نعطي‬ ‫رسالة بعدم وجوده‪.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful