You are on page 1of 32

‫بسم هللا الرمحن الرحمي‬ ‫جامعة صنعاء‬

‫كلية العلوم‬

‫مستوى‪ 3‬رياضيات حاسوب‬

‫‪DATA STRUCTUER‬‬

‫(هياكل بيانات)‬

‫لالستاذ‪:‬‬

‫عمــــر اخلالدي‬

‫‪1‬‬ ‫سهام علً عامر‬


Data structure

Advanced D.S Main D.S

*Array

*Set
*Tree
*stack *Record

*queue *File

*double ended queue

‫بٌانات خام‬:data

‫البٌانات بعد معالجتها‬:Information

Information‫مجموعه من الـ‬:Knowledge

Knowledge‫مجموعه من الـ‬:Experience

decision support system & data mining:Expert system

files ‫مجموعه من الـ‬:Set

records ‫مجموعه من الـ‬: File

‫وهي عباره عن سجل يحتوي مجموعه من البيانات‬:Record

2 ‫سهام علً عامر‬


‫‪Data mining:‬‬

‫*ماهي هيكلة البيانات؟؟هً طرٌقه تم إنشائها لكثرة البٌانات (‪)Data‬المستخدمه فً كل المجاالت فكان‬
‫لزاما علٌنا هٌكلتها وتنظٌمها لمعرفة كٌفٌة الوصول للبٌانات بالطرق االسهل واالدق‪ ,‬والواضح لدٌنا ان‬
‫كل تخصص ٌتعلق بالحاسوب ٌبنى علٌه _‪_Data structure‬‬
‫*ماهو الفرق بين البرنامج والخوارزميه؟؟‬

‫‪Program‬‬ ‫‪Algorithm‬‬

‫‪*Syntax‬‬ ‫‪*Semantic‬‬
‫‪*Machine language‬‬ ‫‪Human language‬‬
‫*غير منتهي‬ ‫*منتهي‬

‫**)‪(Syntax‬‬
‫وهً الصٌػ او اكواد كتابة العمل او التعلٌمات فً لؽات البرمجه وتختلؾ من لؽة برمجه الى اخرى‬
‫**(‪)semantic‬‬
‫وهً معنى الصٌؽه البرمجٌه بشكل عام فً اللوؼارٌتمات او لؽة البشر‬

‫*ماهي الخوارزميات؟؟‬
‫مفهوم الخوارزمٌه قدٌم فقد وضع من قبل البابلٌون (‪ 1800‬سنه ق‪.‬م)فً عهد حام ورابً وهو اول‬
‫توصٌؾ لقواعد بعض انواع المعادالت وجاءت كلمة خوارزمٌه نسبة للعالم المسلم (محمد بن موسى‬
‫الخوارزمً)‪,‬‬
‫والخوارزمٌات هً مجموعه من الخطوات المنطقٌه التً ٌتم تنفٌذها حسب ترتٌب محدد والتً ُتصؾ‬
‫بدقه ووضوح وتكون طرٌقه عامه لحل مسأله معٌنه‪.‬‬

‫‪3‬‬ ‫سهام علً عامر‬


‫ولحل مسائل عن طرٌق الحاسوب ٌجب إتباع الخطوات ذات الترتٌب التالً‪:‬‬
‫‪ .1‬تعرٌؾ المسأله‪ ,‬اي فهمها ثم تحدٌد المدخالت والمخرجات (‪ )I\O‬لهذه المسأله‪.‬‬
‫‪ .2‬التحلٌل‪ ,‬اي تحدٌد العملٌات التً تؤدي الى حل المسأله‪.‬‬
‫‪ .3‬التنفٌذ‪ ,‬اي ادخال البرنامج وبٌاناته الى الحاسوب لحل المسأله واٌجاد الناتج‪.‬‬

‫وكل مسأله نرٌد حلها عن طرٌق خوارزمٌه ٌجب ان تتوفر فٌها المواصفات التالٌه‪:‬‬
‫المدخالت(‪)In put‬واقل قٌمه للمدخالت هً صفر(‪ )i\p>=0‬اي اننا نستطٌع عمل برنامج بدون‬ ‫‪.1‬‬
‫ان نقوم بإدخال اي بٌانات‪.‬‬
‫المخرجات (‪)out put‬واقل قٌمه للمخرجات هً ‪ 1‬اي ان النتائج الخارجه ٌجب ان تكون معلومه‬ ‫‪.2‬‬
‫واحده(‪ )o\p>=1‬على االقل‬
‫كل تعلٌمه (‪ٌ)instruction‬جب ان تكون واضحه لٌس فٌها ؼموض ‪.‬‬ ‫المحدد‪ ,‬ؾ‬ ‫‪.3‬‬
‫ٌجب ان ٌكون لها حد اي (نهاٌه) فإذا قمنا بتتبع اإلٌعازات او األوامر ألي لوؼارٌتمٌه ٌجب ان‬ ‫‪.4‬‬
‫نصل الى عدد محدد من الخطوات فً النهاٌه‪.‬‬
‫الفعالٌه (‪,)effectiveness‬اي ان كل اٌعاز ٌجب ان ٌكون اساسً وبسٌط وفً حال وصول‬ ‫‪.5‬‬
‫العملٌه الٌه ٌجب ان ٌكون قابل للتحقٌق‪.‬‬

‫*ما عالقة الخوارزمٌه بال ‪data structure‬؟؟‬


‫هٌكلة البٌانات هً نتٌجة لدمج الكائنات مع الخوارزمٌات‪,‬‬
‫والكائن(‪ )0bject‬وهو بٌان او رمز تحفظ البٌانات بداخله وقد نعتبره ‪ x‬ونمرر من خالله قٌمه‬
‫(بٌان) وقد نحتفظ بالقٌمه بداخله‪.‬‬

‫*ماهً خصائص الخوارزمٌات‪:‬‬


‫‪ )1‬خطوات الخوارزمٌه مرتبه‪.‬‬
‫‪ )2‬خطواتها منتهٌه‪.‬‬
‫‪ )3‬خطوات الخوارزمٌه تنفذ اعمال بسٌطه‪.‬‬
‫‪ )4‬معرفه جدا‪.‬‬
‫‪ )5‬طرٌقة الحل ٌجب ان تكون عامه‪.‬‬

‫‪4‬‬ ‫سهام علً عامر‬


‫‪ )6‬فعاله وعند تنفٌذ الخوارزمٌه فً الحاسوب ٌجب ان ال تكون التكلفه عالٌه سوا ًء من ناحٌة‬
‫زمن المعالجه (‪)processing time‬او المساحه المشؽوله فً الذاكرة الرئٌسٌه‪.‬‬
‫‪ )7‬استخدام المخططات االنسٌابٌة‪.‬‬
‫‪ )8‬استخدام جمل قصٌره وخالٌه من الكلمات الؽٌر مفٌده‪.‬‬

‫أشكال المخططات االنسٌابٌة‪:‬‬


‫ٌستخدم للداللة على بداٌة ونهاٌة الخوارزمٌه‪.‬‬

‫ٌستخدم للداللة على عملٌات االدخال واالخراج‪.‬‬

‫ٌستخدم للداللة على عملٌات المعالجات الحسابٌه‪.‬‬

‫ٌستخدم الختبار شرط معٌن وعملٌات المقارنه وللعملٌات التً تحتاج الى اتخاذ قرار‪.‬‬

‫ٌستخدم لنقطة عودة البٌان وتصل جز ء معٌن المخطط االنسٌابً بأخر وؼالبا ٌكتب‬
‫داخلها رقم او حرؾ‪.‬‬

‫ٌدل على ترتٌب خطوات الخوارزمٌه‪.‬‬

‫**مثال (‪ )1‬ضع المخطط االنسٌابً لخوارزمٌه لحل المسأله الرٌاضٌه التالٌه‪:‬‬


‫‪Y=3x+4\3-2x‬‬
‫الحل‪:‬‬
‫‪start‬‬

‫=‪X‬‬

‫‪A=3x+4‬‬

‫‪B=3-2x‬‬
‫‪5‬‬ ‫سهام علً عامر‬
‫‪Y=a\b‬‬

‫‪y‬‬

‫‪end‬‬

‫م ثال(‪)2‬صمم المخطط االنسٌابً لخوارزمٌه للمقارنه بٌن عددٌن حقٌقٌن موجبٌن وطباعة االكبر بٌنهما‪:‬‬

‫‪start‬‬ ‫الحل‪:‬‬
‫حٌث ان ‪X,Y‬تمثالن العددٌن الحقٌقٌن المراد‬
‫‪X,Y‬‬
‫المقارنه بٌنهما‪.‬‬

‫‪no‬‬ ‫‪Y>X‬‬ ‫‪Yes‬‬

‫‪x‬‬ ‫‪y‬‬

‫‪End‬‬

‫مثال(‪)3‬ارسم المخطط االنسٌابً للخوارزمٌه المناسبه للمتراجحه التالٌه‪:‬‬


‫‪20 ≤ k ≤ 50‬‬

‫‪start‬‬ ‫الحل‪:‬‬
‫‪hvghh‬وتى‬

‫‪k‬‬

‫‪no‬‬ ‫‪yes‬‬ ‫‪no‬‬


‫‪20≤k‬‬ ‫‪k≤50‬‬

‫‪6‬‬ ‫سهام علً عامر‬


‫‪k‬‬

‫‪K<20‬‬ ‫‪k>50‬‬
‫‪end‬‬

‫المكونات التكرارٌه‪:‬‬
‫ٌتفوق الحاسوب على االنسان بالقدره على تكرار العمل مهما كان حجم التكرار كبٌر وألي فتره زمنٌه‬
‫دون تعب او كلل او ارتكاب اخطاء وٌتم فً حلقة دوران بطرٌقة (‪,)counter‬فبعض المسائل تتضمن‬
‫تكرارلمعالجة بعض أجزائها عدداً معٌن من المرات وٌطلق على هذه العملٌه (‪ )loop‬وهً تكرار‬
‫معالجة مجموعه من الخطوات الى ان ٌتحقق الشرط ثم انهاء البرنامج‪.‬‬

‫*مثال(‪)4‬لدٌنا ‪ 20‬عدد صحٌح ونرٌد فرز الزوجً منها فقط‪:‬‬

‫‪start‬‬

‫‪A,I‬‬

‫‪0<I<20‬‬

‫‪I=I+1‬‬

‫‪no‬‬ ‫‪Amod2=o‬‬ ‫‪Yes‬‬

‫‪A‬‬

‫‪7‬‬ ‫سهام علً عامر‬


‫‪END‬‬

‫*الهٌكل العام للخوارزمٌه‪:‬‬


‫ٌتكون الهٌكل العام للخوارزمٌه من رأس وجسم فٌتكون الرأس من اسم الخوارزمٌه ومجموعة‬
‫(‪ )parameters‬وٌجب ان تنتهً بقوسٌن ()‪ ,‬اما جسم الخوارزمٌه فٌتكون من مجموعة الخطوات او‬
‫االوامر التً تطلبها الخوارزمٌه‪.‬‬

‫*العناصر األساسٌة للخوارزمٌه‪:‬‬


‫‪ ‬اسم الخوارزمٌه ٌكون متبوع بقوسٌن‪.‬‬
‫‪ٌ ‬تم التواصل عن طرٌق (‪ )parameters‬بٌن الخوارزمٌات وتبادل البٌانات‪.‬‬
‫‪ ‬نقطة البداٌه‪.‬‬
‫‪ ‬جسم الخوارزمٌه وداخلها الخطوات واالوامر‪.‬‬
‫‪ ‬النهاٌه (‪)end‬‬
‫مثال‪:‬‬
‫)(‪Algorithm add1‬‬ ‫اسم الخوارزمٌه‬

‫‪Begin‬‬

‫;‪Sum=0‬‬

‫;‪For I = 1 to 10 do‬‬ ‫جسم الخوارزمٌه‬

‫‪Sum=sum+I‬‬

‫‪end‬‬ ‫النهاٌه‬

‫‪8‬‬ ‫سهام علً عامر‬


‫‪Main D.S.:‬‬
‫المصفوفات (‪:)Arrays‬وهً عباره عن مجموعه من البٌانات التً تتشابه فً النوع ولها اسم مشترك‬
‫وتخزن فً الذاكره بشكل تسلسلً‪.‬‬
‫اوالً المصفوفه فً بعد واحد بمعنى اما مصفوفة صؾ واحد اوعمود واحد تحتوي على (‪ٌ )index‬بداء‬
‫من ‪0‬فً لؽة ‪ C‬ومن ‪ 1‬فً لؽة باسكال‪.‬‬

‫وٌتم تمثٌله ب‪)1‬العمودٌه ‪ ,‬بداٌة ال (‪ +)index‬عدد الصفوؾ‬

‫‪)2‬الصفٌه ‪ ,‬بداٌة ال (‪ +)index‬عدد االعمده‬


‫اما اكثر من بُعدين فٌتم تمثٌلها بالطرٌقه االتٌه‪:‬‬
‫‪ )1‬العمود بداٌة ال(‪+ index‬رقم الصؾ ×عدد االعمده)‬
‫‪ )2‬الصؾ بداٌة ال(‪+ index‬رقم العمود ×عدد الصفوؾ)‬

‫تمثٌــــــــــــــل المصفوفه فً الحاسوب‪:‬‬


‫اي مصفوفه مه ما كانت ابعادها سوا ًء بُعد واحد اوعدة ابعاد فإن الحاسوب ٌحولها الى بعد واحد دائما‬
‫وٌعتمد على مواقع العناصر ال(‪ )index‬كما فً الشكل التالً‬

‫(‪:)index‬هً مواقع العناصر فً المصفوفه‬

‫‪9‬‬ ‫سهام علً عامر‬


‫}‪A{0‬‬ ‫}‪A{1} A{2‬‬ ‫}‪A{3‬‬ ‫}‪A{4‬‬ ‫‪....‬‬ ‫‪....‬‬ ‫‪....‬‬ ‫}‪A{I‬‬
‫مواقع العناصر فً مصفوفه ذات بعد واحد فً الحاسوب‬

‫}‪A{0,0‬‬ ‫}‪A{0,1} A{0,2} A{0,3‬‬ ‫‪....‬‬ ‫‪....‬‬ ‫‪...‬‬ ‫‪....‬‬ ‫}‪A{i,j‬‬


‫تمثٌل مواقع العناصر فً مصفوفه ذات عدة ابعاد فً الحاسوب‬

‫عنصر نعتمد على موقع العنصر االول فً‬ ‫وفً المصفوفه ذات البعد الواحد لمعرفة موقع اي‬
‫المصفوفه وذلك الن موقع اول عنصر ٌتولد عشوائٌا (ألنه فً ال ‪)ram‬اعتماداً على ما قبله من قٌم‬
‫والذي ٌلٌه ٌكون تراكمً‪ ,‬وتوزع العناوٌن اوتوماتٌكٌا ً وحسب نوع البٌانات‪.‬‬
‫فمثال بفرض ان نوع البٌانات ‪ integer‬والم وقع االول هو ‪ 005‬فإن الموقع الذي ٌلٌه هو ‪ 007‬وذلك‬
‫الن هذا النوع من البٌانات ٌحجز تلقائٌا ‪2‬باٌت فً الذاكره لكل عنصر‪.‬‬
‫}‪A{1‬‬ ‫}‪A{2‬‬ ‫}‪A{3‬‬ ‫‪.....‬‬ ‫‪....‬‬ ‫‪....‬‬
‫‪005‬‬ ‫‪007‬‬ ‫‪009‬‬ ‫وذلك بفرض ان البٌانات من نوع ‪integer‬‬

‫*وإلٌجاد موقع اي عنصر نأخذ الخوارزمٌه التالٌه وهً بلؽة باسكال‪:‬‬


‫)‪Loc (a{i}) = add (a{1} + size of type * i-1‬‬
‫حٌث ان }‪ a{i‬هو موقع العنصر المراد اٌجاده‬

‫}‪ A{1‬عنوان اول عنصر فً المصفوفه‬

‫‪ size of type‬حجم نوع البٌانات‬

‫‪ i-1‬وهو موقع العنصر السابق للعنصر المطلوب‬

‫*مثال ‪ :‬اوجد قٌمة الموقع }‪ a{3‬فً الشكل السابق‪:‬‬

‫)‪Loc (a{3}) = add (a{1} + 2*2‬‬

‫) ‪=(005 + 2*2‬‬

‫‪=009‬‬

‫وإلٌجاد موقع العنصر نفسه بلؽة ال‪C++‬‬

‫)‪Loc(a{i}) = add (a{0} + size of type *I‬‬

‫‪10‬‬ ‫سهام علً عامر‬


‫) ‪Loc (a{2}) = add (a{0} + 2*2‬‬
‫}‪A{0} A{1} A{2‬‬ ‫‪....‬‬ ‫‪....‬‬ ‫‪....‬‬
‫‪005‬‬ ‫‪007‬‬ ‫‪009‬‬ ‫)‪=(005+ 2*2‬‬

‫‪=009‬‬

‫*اما فً المصفوفه ذات عدة بعدٌن نجد مواقع المصفوفه التالٌه بلؽة الباسكال كالتالً‪:‬‬
‫}‪A{1,1‬‬ ‫}‪A{1,2‬‬ ‫}‪A{1,3‬‬ ‫‪....‬‬ ‫‪....‬‬ ‫‪....‬‬
‫‪005‬‬ ‫‪007‬‬ ‫‪009‬‬ ‫‪011‬‬

‫])‪Loc (a{i},{j}) = add (a{1} {1} + size of type *[M*(i-1)+(j-1‬‬

‫حٌث ان ‪ m‬عدد االعمده الكلً‬

‫** وفً لؽة ال ‪:C++‬‬

‫)‪Loc (a{i},{j}) = add (a{0},{0}) + size of type*(M*i+j‬‬

‫‪:Advanced D.S.‬‬
‫‪:Stack‬‬
‫هو عباره عن مصفوفه ُتعبأ البٌانات فٌها بطرٌقه تعكس البٌانات ‪ ,‬وهو نمط من الـ ‪D.S.‬‬

‫وعملٌة عكس البٌانات تحدث بسبب وضعٌة الـ‪ Stack‬وترتب البٌانات على حسب ‪Frist in last (FILO‬‬
‫)‪out‬‬

‫ودخول البٌانات وخروجها ٌتم من نهاٌه طرفٌه واحده تسمى (‪ )top of the stack‬المؤشر‬

‫‪I\P‬‬ ‫‪O\P‬‬
‫‪TOP of the stack‬‬
‫‪D‬‬
‫‪stack‬‬ ‫‪C‬‬
‫‪B‬‬
‫‪A‬‬
‫‪11‬‬ ‫سهام علً عامر‬
‫ماهً العملٌات(‪ )primitive operation‬التً ٌجرٌها الـ ‪:stack‬‬

‫‪)1‬التهٌئه (‪ )initialization‬وفٌه ٌتم تحدٌد حجم الـ‪ stack‬وموقع المؤشر ونوعه‬

‫‪)2‬االدخال (‪)insertion( or )push‬‬

‫‪)3‬االخراج(‪)deletion( or )pop‬‬

‫ولدٌنا ‪ top‬وهو المؤشر الخاص بـ‪. stack‬‬

‫ففً البداٌه ٌكون المؤشر (‪ )top‬فً االسفل وكلما تم ادخال بٌان على الـ ‪ٌ stack‬صعد المؤشر الى‬
‫االعلى فٌعتمد حجم الـ‪ stack‬على موقع المؤشر‪ ,‬فعندما ٌكون الـ‪ stack‬فارؼا ً تكون قٌمة المؤشر‬

‫(‪ 1-‬فً ‪ )c‬و (‪ 0‬فً باسكال)‬

‫ومن صفات المؤشر (‪:)top‬‬


‫‪)1‬هو مؤشر ٌصعد وٌهبط على حسب العملٌات (ادخال‪ ,‬اخراج)‬
‫‪)2‬وهو موقع فً الذاكره ٌحمل قٌمه واحده‬
‫‪ٌ)3‬تناقص عند الحذؾ وٌزداد عند االضافه او االدخال‬
‫‪ٌ)4‬دل على حجم الـ‪stack‬‬

‫‪)5‬عند االدخال (‪ٌ )push‬جب التأكد ان المؤشر لم ٌصل الى القٌمه العظمى‬

‫‪)6‬عند االخراج (‪ٌ )pop‬جب التأكد ان المؤشر لٌس فارؼا‬

‫وعند تهٌئة الـ‪ stack‬علٌنا ان نعطً المؤشر قٌمه تدل على انه فارغ ونحدد الـ‪ stack‬بـ ‪ s‬و‪ item‬ب ‪i‬‬

‫فٌقدموا لنا عملٌة االدخال )‪ push(I , s‬و االخراج )‪pop(s‬‬

‫‪e‬‬

‫‪d‬‬ ‫‪d‬‬ ‫‪d‬‬


‫‪c‬‬ ‫‪c‬‬
‫‪c‬‬ ‫‪c‬‬ ‫‪c‬‬
‫‪b‬‬ ‫‪b‬‬
‫‪b‬‬ ‫‪b‬‬ ‫‪b‬‬ ‫‪b‬‬
‫‪aa‬‬ ‫‪a‬‬
‫‪a‬‬ ‫‪a‬‬ ‫‪a‬‬ ‫‪a‬‬
‫‪12‬‬ ‫سهام علً عامر‬
‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬
‫‪A‬‬

‫))‪Push (s , c) ; (frame (b‬‬

‫))‪Push (s , d) ; (farm (c‬‬

‫))‪Push (s , e) ; (farm (d‬‬

‫))‪Push (s ,f) ; (farm (e‬‬

‫))‪Pop (s) ; (farm (e‬‬

‫))‪Pop (s) ; (farm (f‬‬

‫وسمٌت بالـ ‪ push down list‬بسبب العملٌات المتكرره‬

‫اذن ما نالحظه ٌشرح لنا عملٌات ‪pop & push‬‬

‫و ٌنتج لنا االطار وٌتم داخله جمٌع العملٌات وهو اٌضا ً ماٌُعرؾ بالـ‪ array‬ومعه المؤشر‪.‬‬

‫المختص بإنشاء (‪)stack‬‬ ‫*االطار (‪ )frame‬فً الخوارزمٌات ولؽات البرمجه هو الكود الخاص‬
‫والمؤشر والـ ‪items‬‬

‫**تمثٌل الـ ‪ stack‬بلؽة ال ‪: C‬‬

‫مثال‪ :‬انشئ بلؽة ‪ )stack( C‬حجمه ‪:100‬‬

‫>‪Include<isotream.h‬‬

‫‪# dfine st_size 100‬‬

‫‪Stract stack‬‬

‫{‬

‫;‪Int top‬‬

‫‪frame‬‬ ‫;]‪Int item [s+ size‬‬

‫;}‬

‫‪13‬‬ ‫سهام علً عامر‬


‫الـ‪ٌ frame‬حتوي على عنصرٌن رئٌسٌن‪:‬‬

‫‪ ‬مصفوفه لتحمل جمٌـع العناصر لـ‪stack‬‬


‫‪ Integer ‬لٌشٌر الى موقع مؤشر الــ‪stack‬‬

‫*صمم إستماره تحتوي على ‪ 20‬عنصر (اسماء طالب)‬


‫‪# dfine name_size 20‬‬

‫‪Strict‬‬ ‫‪stack‬‬

‫{‬

‫;‪Int top‬‬

‫]‪Char item [name_size‬‬

‫;‪}s‬‬

‫‪ S‬عباره عن كائن نضع فٌه البٌانات وتوجد عملٌات تطبٌقٌه ستؤخذ الحقا ً تعتمد على االدخال‬
‫واالخراج‪.‬‬
‫لو افترضنا ان عناصر الـ ‪ stack‬تحتوي العناصر ]‪ item[0] to item[99‬واٌضا ً ال ٌوجد لدٌنا سبب‬
‫بان نجعلها محدده فقط على نوع واحد من البٌانات ولكن نفرض اننا نحتاج عدة انواع من البٌانات مثالً‬

‫‪ Float , char , int‬او أٌا كانت نوع البٌانات التً سنعطٌها للـ‪stack‬‬

‫اذن ٌمكن للـ‪ stack‬ان تحتمل مختلؾ انواع البٌانات‬

‫‪# dfine STACK SIZE 100‬‬

‫‪# dfine INT 1‬‬

‫‪# dfine FLOAT 2‬‬

‫‪# dfine STRING 3‬‬

‫‪Stract stack element‬‬

‫‪{ int e type‬‬


‫‪14‬‬ ‫سهام علً عامر‬
Union

{ int I val;

Float f val;

String c val;

}element;

Strict stack

Int top ;

Strict stack element item[STACKSIZE] };

: stack‫ولطباعة العنصر االعلى للـ‬

Strict stack element sp;

Sp = s.item {s.top}

Switch (sp-etype)

case INT :print f (sp.i vaI);

Case fIoaT :print f (sp.f vaI);

Case string :print f (sp.c vaI);

}
15 ‫سهام علً عامر‬
‫وعندما تكون ال‪stack‬فارؼه ال تحتوي على عناصر نجعل ال‪ 1-=top‬أي (‪)s. top=-1‬كود برمجً‬

‫;)‪If(s.top==-1‬‬

‫;)‪Return(nuII/Empty‬‬

‫‪Else‬‬

‫;)‪Return (item‬‬

‫ااو كخوارزمٌه عامه‬


‫)‪If(s.top == -1‬‬

‫;‪stack is empty‬‬

‫‪Else‬‬

‫;‪Stack is not empty‬‬

‫تطبٌقات الـ ‪:pop‬‬

‫إحتمالٌات (‪" )under flow‬وهً الوصول الى النهاٌه" توجب علٌنا دراسة عملٌة الـ ‪ pop‬للعناصر‬
‫داخل الـ‪ stack‬الذي قد ٌكون فارؼا وتجنب ذلك‪.‬‬
‫عند عمل مثل هذا الطلب عن طرٌق المستخدم ٌجب إظهار رساله للمستخدم تعلمه انه ال ٌوجد اي قٌم‬
‫وتخبره عن حالة (‪ )under flow‬هذا ٌحتم على الـ‪ pop‬ان ٌؤدي الخٌارات الثالثه التالٌه‪:‬‬

‫‪)1‬اذا كان الـ‪ stack‬فارؼا إطبع رسالة تحذٌر وأوقؾ التنفٌذ (‪)halt execution‬‬

‫‪)2‬أبعد المؤشر (‪ )top‬من الـ‪stack‬‬

‫‪)3‬ارجع هذا العنصر ‪ element‬للبرنامج الذي ٌقوم باالستدعاء‪.‬‬

‫‪16‬‬ ‫سهام علً عامر‬


:‫*مثــال‬
Int pop (struct stack .ps)

If (empty (sp) );

{ print ("stack under flow") ;

Exit();

Return (ps_item s [ps_top--]);

‫ تستدعى‬pop ‫ولو افترضنا ان عملٌة‬

ps;

ps_top[88];

‫فٌأشر الى‬ ps_top[87];

:push ‫تطبٌقات لعملٌات‬

: ً‫ اإلجراءات تكون كالتال‬push‫ وأول محاولة للـ‬pest array ‫وهذه تكون أسهل فً التطبٌق باستخدام مصفوفة‬

Void push(struct stack PS, int x )

PS items] ++(PS Top)[=x;

Return;

}
17 ‫سهام علً عامر‬
‫‪ push‬إلى ‪ stack‬بزٌادة ‪ S.top‬بقٌمة واحدة‪.‬‬ ‫وهنا اإلجراء ٌجعل ‪item x‬‬

‫ومن ثم ٌدخل قٌمة ‪ x‬إلى عناصر ‪ array s‬لكن تدخل معنا مشكلة ‪ overflow‬وأن تطفح الحاوٌة ‪ stack‬بـ‪ items‬عن‬
‫المقدر له هنا ٌجب إظهار رسالة بذلك ‪.‬‬

‫)‪Void push (struct* PS; int x‬‬

‫{‬

‫‪If(PS‬‬ ‫)‪top== stack size -1‬‬

‫;)"‪{print f("stack is full‬‬

‫;)‪Exit(1‬‬

‫‪}else‬‬

‫‪PS‬‬ ‫‪items](PS‬‬ ‫;[ )‪top‬‬

‫;‪Return‬‬

‫;}‬

‫مالحظـــة‪:‬‬

‫‪/1‬أي شًء ٌستخدم مصفوفة ٌواجه مشاكل تحتاج لحل ‪.‬‬

‫‪/2‬ال تستطٌع تؽٌٌر حجم المصفوفة أثناء التنفٌذ بالبرنامج ‪.‬‬

‫*‪:Infix, postfix, prefix‬‬


‫إذا كانت العملٌه ضمن المعادله فتعتبر ‪Infix‬‬
‫واذا كانت العملٌه تلحق بالمعادله فتعتبر ‪postfix‬‬
‫اما اذا كانت العملٌه سابقه للمعادله فتعتبر ‪prefix‬‬
‫هذا القسم ٌعتبر التطبٌق الرئٌسً الذي ٌوضح االنواع المختلفه بالـ‪ stack‬والعملٌات المتنوعه واٌضا‬
‫الدوال المطبقه علٌهم‪.‬‬

‫‪18‬‬ ‫سهام علً عامر‬


‫*مثــال للتوضــــــٌح‪:‬‬

‫= ‪Infix‬‬ ‫‪A+B‬‬
‫=‪Postfix‬‬ ‫‪AB+‬‬
‫=‪Prefix‬‬ ‫‪+AB‬‬
‫حٌث ان ‪operands=A,B‬‬

‫‪ +,-,*,%,$‬وؼٌرها تكون ‪( operator‬عملٌات)‬


‫اي ان هذه التسمٌات تطلق على حسب موقع العملٌات ‪.‬‬

‫**مثــال‪:‬‬

‫‪:‬‬ ‫حول العملٌه التالٌه الى ‪ Postfix‬و‪Prefix‬‬


‫‪1( A+B*C‬‬

‫نقوم بتحرٌك العملٌات فقط ولٌس العملٌات‪,‬‬


‫‪Prefix= +A*BC‬‬

‫*‪Postfix=A+BC‬‬

‫‪=ABC*+‬‬

‫** مثال‪:‬‬

‫اذا كان لدٌنا المعادله االولى ولكن مع وجود اولوٌه للجمع حولها لل ‪: Postfix , Prefix‬‬

‫‪(A+B)*C‬‬

‫‪Prefix 1)=+AB*C‬‬

‫‪2)=*+ABC‬‬

‫*‪Postfix= AB+C‬‬
‫‪19‬‬ ‫سهام علً عامر‬
‫ولو اعتبرنا ان لدٌنا ‪ operators 5‬التالٌه اضافه الى العملٌات المنطقٌه‪:‬‬

‫‪Add )a‬‬
‫‪Multiplication )b‬‬
‫‪Subtraction )c‬‬
‫‪Division )d‬‬
‫‪Exponentiation )e‬‬
‫‪Not )f‬‬
‫‪ % )g‬باقً القسمه‬
‫فٌكون ترتٌب أولوٌة العملٌات كما ٌلً ‪:‬‬
‫() العملٌات داخل االقواس‬
‫‪not , $‬‬

‫‪%‬‬
‫‪*,/‬‬
‫‪-,+‬‬
‫≤‪>,<,≥,‬‬
‫|| ‪&& ,‬‬

‫** مثــال‪ :‬حول المعادله التالٌه الى ‪:postfix & prefix‬‬

‫)‪=(A+B) * (C-D‬‬

‫)‪Prefix =1) (+AB) * (-CD‬‬

‫‪2)*+AB -CD‬‬

‫)‪Postfix =1) (AB+) * (CD-‬‬

‫‪20‬‬ ‫سهام علً عامر‬


2)AB+ CD-*

:‫** مثال‬
A$B*C-D+E/F/(G+H)

prefix= 1) $AB*C –D+E/F/ (G+H)

2)*$ABC- D+E/F/ (G+H)

3) -*$ABCD +E/F/ (G+H)

4)+-*$ABCD//EF +GH

‫ لنفس المعادله؟؟‬postfix ‫ اوجد‬:‫تمرٌن‬

:‫** مثال‬
=((A+B)*C-(D-E)) $ (F+G)

Prefix=1) ((+AB)* C- (-DE) $ (F+G)

2) -*+ABC-DE$(+FG)

‫ لنفس المعادله؟‬postfix ‫ اوجد‬:‫تمرٌن‬

:TREE ‫طريقة‬
1: (A+B) * (C-D)

A+B C-D
21 ‫سهام علً عامر‬
*

+ -

A B C D

Per = *+AB-CD

Post = AB+CD-*

.‫ونختار العملٌه االولى بحٌث ٌحصل توازن فً المعادله‬


+
2:A$B*C-D+E/F/(G+H)
PER post

/ +

-
E
/ A$B*C-D E/F/(G+H)

D
* F
+

C PER = +-*$ABCD//EF+GH
$

G H

A B

3:(X+Y*Z> 100)&&Cll ! D

22 ‫سهام علً عامر‬


ll

(X+Y*Z>100)&&C !D

ll

&
!
&
&
>
C D

+ 100

* X

Y Z

pre = ll&&>+X*YZ100C!D+

:Queue
23 ‫سهام علً عامر‬
‫ماهو الفرق بٌن الـ ‪ stack‬و الـ ‪queue‬؟؟‬

‫*الـ‪ :stack‬كما ذكرنا إنها مصفوفه ٌتم التعامل معها بطرٌقه ممٌزه بحٌث ٌكون الـ ‪ I/O‬من طرؾ واحد‬
‫بواسطة الـ ‪Top‬‬

‫* الـ ‪:queue‬هً اٌضا ً مصفوفه لكنها مفتوحة الطرفٌن ‪ ,‬اذن فهً تحتاج الى مؤشرٌن ٌقومان بعملٌات‬
‫الحذؾ واالضافه ‪.‬‬
‫‪( Rear‬مؤشر عملٌة االدخال)‬ ‫‪insert (1‬‬

‫‪( Front‬مؤشر عملٌات االخراج)‬ ‫‪delete (2‬‬

‫‪R‬‬ ‫‪F‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C …..‬‬

‫(‪)queue‬‬

‫كٌؾ تتم التهٌئـــــــه؟‬


‫فً الـ‪ stack‬كانت تتم التهٌئه بجعل (‪, )Top = Null‬‬

‫أما فً الـ ‪ٌ queue‬كون من خالل ‪ Rear‬الذي ٌتحكم بالتهٌئه عندما تكون (‪ )R= -1 , F= 0‬وبذلك ٌتولد‬
‫لدٌنا قانون خاص بالـ ‪ queue‬وهو )‪ (R < F‬عند التهٌئه‬

‫وإلٌجاد عدد عناصر الـ ‪ queue‬نستخدم القانون‪:‬‬

‫* )‪(Q =R – F + 1‬‬

‫** تمثٌل عملٌة اإلضافه ‪: Insert‬‬


‫‪-1-0+1=0‬‬
‫‪24‬‬ ‫سهام علً عامر‬
‫‪0-0+1=1‬‬ ‫‪1-0+1=2‬‬

‫‪f=0‬‬ ‫‪f=0‬‬ ‫‪f=0‬‬

‫‪R=-1‬‬ ‫‪A‬‬ ‫‪A B‬‬


‫‪R=2‬‬
‫‪R=0‬‬ ‫‪R=1‬‬

‫‪2-0+1=3‬‬

‫‪f=0‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬


‫‪R=2‬‬

‫ولتمثٌل عملٌة الحذؾ‪ :‬مثال(‪)Delete A‬‬

‫‪2-1+1=2‬‬ ‫‪2-2+1=1‬‬ ‫‪2-3+1=0‬‬


‫‪f=1‬‬ ‫‪f=2‬‬

‫‪B‬‬ ‫‪C‬‬ ‫‪C‬‬ ‫‪R<f‬‬

‫‪R=2‬‬ ‫‪R=2‬‬ ‫‪R=2‬‬

‫الفرق بًن عملٌتً الحذؾ واالضافه فً ال ‪ stack‬وال ‪queue‬‬

‫فً ‪ stack‬اذا اردنا الحذؾ نجعل ال ‪ Top‬عند القٌمه المراد حذفها ثم نحذؾ فتنتقل قٌمة ال‪ Top‬وعند‬
‫االضافه تزٌد قٌمة ال ‪Top‬‬

‫‪ :Queue‬عند الحذؾ تتزاٌد قٌمة ‪front‬وتبقى قٌمة ‪ rear‬ثابته وعند االضافه تتزاٌد قٌمة ‪ rear‬وتبقى‬
‫‪ front‬ثابته‪.‬‬

‫وعندما ‪ٌ R < F‬كون ال‪ Queue‬مهٌئه‪.‬‬

‫*برنامج من اجل إنشاء ‪ٌQueue‬حمل مؤشرٌن‪:‬‬


‫‪25‬‬ ‫سهام علً عامر‬
Struct Queue

Char element [max];

Int r, f ;

:Queue ‫** برنامج لتهٌئة ال‬

Intial (struct Queue * pq)

Pq rear= -1;

Pq front= 0;

:‫*** خوارزمٌة برنامج إضـــــــــــــافه‬


Insert (struct queue * pq , char)

If (pq rear < max – 1)

{ (pq rear)++

Pq element [pq rear]=e;

Else print f ("full");

26 ‫سهام علً عامر‬


‫**** خوارزمٌة برنامج حذؾ ‪:‬‬
‫)‪Char delete (struct queue * pq‬‬

‫{‬

‫‪If (pq‬‬ ‫‪rear < pq‬‬ ‫;)‪front‬‬

‫{‬

‫)"‪Print f ("empty‬‬

‫; ‪Return‬‬

‫}‬

‫‪Else‬‬

‫‪Return (pq‬‬ ‫‪element [pq‬‬ ‫‪element [pq‬‬ ‫;]‪front++‬‬

‫}‬

‫‪F‬‬

‫فال نستطٌع االضافه ألن المؤشر ٌشٌر الى االمتالء‬ ‫‪A‬‬ ‫اما اذا كان لدٌنا هذا الشكل‬
‫‪R‬‬

‫بحسب الترتٌب ولكنه فً الحقٌقه فا رغ‪ .‬ولذلك نجد أن الحل فٌه عملٌة ‪ shift‬لنقل العناصر وهذا ٌأخذ منا وقت‬
‫كبٌر وأٌضا جهد فً عمل ‪ code‬وأٌضا ٌؤثر على مشكلة األسبقٌة ولذلك ظهرت لدٌنا ‪. Queue circular‬‬

‫‪27‬‬ ‫سهام علً عامر‬


‫‪: Linked list‬‬

‫كما ذكرنا أن ‪ stack‬و ‪ Queue‬عبارة عن مصفوفا ت لها خصائصها واحتٌاجاتها من الناحٌة الخوارزمٌة ومن الناحٌة‬
‫البرمجٌة وقواعدها فً اإلدخال واإلخراج وعملٌة الحفظ للعناصر والتً تتم فً عناوٌن ثابتة فً الذاكرة ‪. Index‬وهنا‬
‫ٌأتً تمثٌل المصفوفات فً الذاكرة بطرٌقة دٌنامٌكٌة تسمى ‪Dynamic representation‬‬
‫‪memory address‬‬

‫‪A 002‬‬ ‫‪002‬‬ ‫تمكنها من الحفظ واإلضافة وتمثل على شكل عُقد‬

‫‪info value‬‬ ‫‪003‬‬ ‫)‪ (node‬وكنا إذا أردنا تحدٌد حجم الـ‪ stack‬و‪Queue‬‬
‫‪002‬‬ ‫فال بد أن نحدده قبال وٌصبح هنا الحجم ثابت ‪.‬‬

‫ولكن هنا فً ‪ Linked list‬ال نحدد الحجم مسبقا‬

‫فكنا إذا أردنا إضافة عنصر ٌنشأ عقدة جدٌدة وهكذا ‪.‬‬

‫وللربط بٌن العُقد ٌكون بحسب العناوٌن ‪ .‬مثال‪-:‬‬

‫‪002‬‬ ‫‪001‬‬ ‫‪003‬‬


‫‪Ahmed‬‬ ‫‪001‬‬ ‫‪Khalid‬‬ ‫‪Muhammad‬‬ ‫‪002‬‬

‫وإلنشاء سجل عن طرٌق ‪ node‬بلؽة الباسكال‪:‬‬

‫‪Ptr node=^Node‬‬

‫‪Node=Record‬‬

‫]‪Name=string [20‬‬

‫‪ID=Int‬‬

‫;‪Link: Ptr, Node‬‬

‫‪End‬‬

‫^ ‪:‬عندما ٌجد الـ ‪ compiler‬هذه العالمة فإنه ٌقوم بتعرٌفها الحقا على حسب لؽة البرمجة فً ‪ C++language‬سٌتم‬
‫تعرٌفها فً جمٌع اللؽات على حسب اللؽة إال فً لؽة الباسكال فهو ٌعرؾ هذه العالمة محجوزة ‪.‬‬
‫‪28‬‬ ‫سهام علً عامر‬
‫‪(:Link‬الرابط) ٌؤشر على ‪ node‬من نفس النوع ‪.‬‬

‫‪Node‬آخر‪.‬‬ ‫وفً المثال السابق نعرؾ الرابط ‪ link‬بنفس ‪( Ptr Node‬بنفس المؤشر)فهو ٌحمل عنوان‬

‫ومن أجل إنشاء أول عُقدة نستخدم مُعرؾ جدٌد(‪ )New‬ومن أجل تعبئة البٌانات سنكتب عبارة التعبئة ( ‪first‬‬
‫;’‪.)^.Name=’A‬‬

‫‪Begin‬‬

‫)‪First (New‬‬

‫;‪First ^.Link =null‬‬

‫;’‪First ^.Name=’A‬‬ ‫‪A‬‬


‫;‪End‬‬

‫عملٌة الحذؾ نضٌؾ عبارة ;‪.despose first‬‬

‫من ممٌزات ‪:Linked list‬‬

‫‪)1‬عند الحذؾ َتحذؾ العنصر فعلٌا من الذاكرة وال نستطٌع استرجعها ‪.‬‬

‫‪)2‬لكل سلسلة ال بد أن ٌكون لها مؤشر ألول السلسلة وإذا فُقد الرابط (‪ )link‬نفقد البٌانات وحٌنها تظهر لنا رسالة وهً‬
‫الذاكرة ممتلئة ‪.‬‬

‫‪)3‬إذا خرجنا من البرنامج تبقى العناصر فً الذاكرة حاجز ًة مساحة إلى أن ٌتم حذفها على عكس المصفوفات‬
‫عند إؼالق البرنامج فإن البٌانات ُتحذؾ ‪.‬‬

‫ولو قمنا بلؽة ‪ C++‬بتعرٌؾ رابط وعقدة جدٌدة ٌجب أن ٌحتوي هذا التعرٌؾ على ثالث نقاط أساسٌة ‪:‬‬

‫أ ‪ -‬نقطة البداٌة ‪.‬‬


‫ب ‪ -‬المعلومة التً بداخل هذه النقطة ‪.‬‬
‫ت ‪ -‬الرابط (‪)Link‬‬

‫جملة التصرٌح (‪)1‬‬ ‫‪Struct prt Node‬‬

‫{‬

‫;‪Int info‬‬

‫;‪Struct ptr Node *link‬‬

‫;‪*First, *last‬‬

‫‪29‬‬ ‫سهام علً عامر‬


‫}‬

‫هذا البرنامج ٌحدد أول عُقدة وآخر عُقدة للبرنامج ‪.‬‬

‫جملة تصرٌح (‪.)2‬‬ ‫‪Type def struct ptr Node Node‬‬

‫وعند هذا التصرٌح ٌجب أن أنسب جمٌع المتؽٌرات إلٌه مثل ‪:‬‬

‫‪Type def int x.‬‬

‫إذا أردنا الحجز فً الذاكرة هذا ٌعنً أننا نرٌد أن نحجز فً مؤشر لو افترضنا ‪.....‬‬

‫;‪ Int *p‬لو عرفنا ;)‪P=malloC(2‬‬

‫;‪Int *P‬‬

‫;)‪P=malloC(2‬‬

‫ننش ‪ have‬بدالة اإلنشاء وهً ‪.get Node‬‬


‫مثــــال‪ :‬للحصول على ‪ٌ Node‬جب أن أ‬

‫إنشاء ‪ Node‬جدٌد ضمن‪ Node‬السابقة‪:‬‬

‫) ( ‪Node *get Node‬‬

‫{‬

‫;‪Node *P‬‬

‫;))‪P= (Node*) malloC (size of (int‬‬

‫;‪return‬‬

‫}‬

‫أنشأ عقدة جدٌدة ‪ f‬تكون بالشكل‪:‬‬

‫‪Node *f‬‬

‫) ( ‪F=get Node‬‬

‫‪30‬‬ ‫سهام علً عامر‬


‫أدخل قٌمة لهذه العُقدة ثم احذفها؟‬

‫‪ Linked lest‬لها شروط‪:‬‬

‫‪ ‬إذا كانت وحٌدة لها برنامج وهو ‪:‬‬

‫)‪Intial (Node *f‬‬

‫{‬

‫;‪F=get Node‬‬

‫;‪f -<Link=null‬‬

‫;‪f-< Info=7‬‬

‫}‬

‫‪ ‬فً حالة أننا نرٌد إضافة عقدة جدٌدة للسابقة بحٌث أن تكون‪ f‬هً األولى حٌث أن تكون العقد‪ f‬هً األولى وتأخذ‬
‫دائما قٌم الجدٌدة والقٌم السابقة إدخالها تنزاح إلى العقد الجدٌدة ‪.‬‬

‫‪f‬‬ ‫‪p‬‬ ‫‪p‬‬


‫‪7‬‬

‫)‪(a‬‬ ‫)‪(b‬‬

‫‪f‬‬ ‫‪p‬‬
‫‪7‬‬ ‫‪8‬‬ ‫‪7‬‬

‫)‪(c‬‬ ‫)‪(d‬‬

‫)‪Insertion (Node *P‬‬

‫{‬

‫;‪P=get Node‬‬

‫;‪P->link=f‬‬
‫‪31‬‬ ‫سهام علً عامر‬
‫;‪P=f‬‬

‫;‪f->info=8‬‬

‫}‬

‫‪32‬‬ ‫سهام علً عامر‬

You might also like