Professional Documents
Culture Documents
كلية العلوم
DATA STRUCTUER
(هياكل بيانات)
لالستاذ:
عمــــر اخلالدي
*Array
*Set
*Tree
*stack *Record
*queue *File
بٌانات خام:data
Informationمجموعه من الـ:Knowledge
Knowledgeمجموعه من الـ:Experience
*ماهي هيكلة البيانات؟؟هً طرٌقه تم إنشائها لكثرة البٌانات ()Dataالمستخدمه فً كل المجاالت فكان
لزاما علٌنا هٌكلتها وتنظٌمها لمعرفة كٌفٌة الوصول للبٌانات بالطرق االسهل واالدق ,والواضح لدٌنا ان
كل تخصص ٌتعلق بالحاسوب ٌبنى علٌه __Data structure
*ماهو الفرق بين البرنامج والخوارزميه؟؟
Program Algorithm
*Syntax *Semantic
*Machine language Human language
*غير منتهي *منتهي
**)(Syntax
وهً الصٌػ او اكواد كتابة العمل او التعلٌمات فً لؽات البرمجه وتختلؾ من لؽة برمجه الى اخرى
**()semantic
وهً معنى الصٌؽه البرمجٌه بشكل عام فً اللوؼارٌتمات او لؽة البشر
*ماهي الخوارزميات؟؟
مفهوم الخوارزمٌه قدٌم فقد وضع من قبل البابلٌون ( 1800سنه ق.م)فً عهد حام ورابً وهو اول
توصٌؾ لقواعد بعض انواع المعادالت وجاءت كلمة خوارزمٌه نسبة للعالم المسلم (محمد بن موسى
الخوارزمً),
والخوارزمٌات هً مجموعه من الخطوات المنطقٌه التً ٌتم تنفٌذها حسب ترتٌب محدد والتً ُتصؾ
بدقه ووضوح وتكون طرٌقه عامه لحل مسأله معٌنه.
وكل مسأله نرٌد حلها عن طرٌق خوارزمٌه ٌجب ان تتوفر فٌها المواصفات التالٌه:
المدخالت()In putواقل قٌمه للمدخالت هً صفر( )i\p>=0اي اننا نستطٌع عمل برنامج بدون .1
ان نقوم بإدخال اي بٌانات.
المخرجات ()out putواقل قٌمه للمخرجات هً 1اي ان النتائج الخارجه ٌجب ان تكون معلومه .2
واحده( )o\p>=1على االقل
كل تعلٌمه (ٌ)instructionجب ان تكون واضحه لٌس فٌها ؼموض . المحدد ,ؾ .3
ٌجب ان ٌكون لها حد اي (نهاٌه) فإذا قمنا بتتبع اإلٌعازات او األوامر ألي لوؼارٌتمٌه ٌجب ان .4
نصل الى عدد محدد من الخطوات فً النهاٌه.
الفعالٌه (,)effectivenessاي ان كل اٌعاز ٌجب ان ٌكون اساسً وبسٌط وفً حال وصول .5
العملٌه الٌه ٌجب ان ٌكون قابل للتحقٌق.
ٌستخدم الختبار شرط معٌن وعملٌات المقارنه وللعملٌات التً تحتاج الى اتخاذ قرار.
ٌستخدم لنقطة عودة البٌان وتصل جز ء معٌن المخطط االنسٌابً بأخر وؼالبا ٌكتب
داخلها رقم او حرؾ.
=X
A=3x+4
B=3-2x
5 سهام علً عامر
Y=a\b
y
end
م ثال()2صمم المخطط االنسٌابً لخوارزمٌه للمقارنه بٌن عددٌن حقٌقٌن موجبٌن وطباعة االكبر بٌنهما:
start الحل:
حٌث ان X,Yتمثالن العددٌن الحقٌقٌن المراد
X,Y
المقارنه بٌنهما.
x y
End
start الحل:
hvghhوتى
k
K<20 k>50
end
المكونات التكرارٌه:
ٌتفوق الحاسوب على االنسان بالقدره على تكرار العمل مهما كان حجم التكرار كبٌر وألي فتره زمنٌه
دون تعب او كلل او ارتكاب اخطاء وٌتم فً حلقة دوران بطرٌقة (,)counterفبعض المسائل تتضمن
تكرارلمعالجة بعض أجزائها عدداً معٌن من المرات وٌطلق على هذه العملٌه ( )loopوهً تكرار
معالجة مجموعه من الخطوات الى ان ٌتحقق الشرط ثم انهاء البرنامج.
start
A,I
0<I<20
I=I+1
A
Begin
;Sum=0
Sum=sum+I
end النهاٌه
عنصر نعتمد على موقع العنصر االول فً وفً المصفوفه ذات البعد الواحد لمعرفة موقع اي
المصفوفه وذلك الن موقع اول عنصر ٌتولد عشوائٌا (ألنه فً ال )ramاعتماداً على ما قبله من قٌم
والذي ٌلٌه ٌكون تراكمً ,وتوزع العناوٌن اوتوماتٌكٌا ً وحسب نوع البٌانات.
فمثال بفرض ان نوع البٌانات integerوالم وقع االول هو 005فإن الموقع الذي ٌلٌه هو 007وذلك
الن هذا النوع من البٌانات ٌحجز تلقائٌا 2باٌت فً الذاكره لكل عنصر.
}A{1 }A{2 }A{3 ..... .... ....
005 007 009 وذلك بفرض ان البٌانات من نوع integer
) =(005 + 2*2
=009
=009
*اما فً المصفوفه ذات عدة بعدٌن نجد مواقع المصفوفه التالٌه بلؽة الباسكال كالتالً:
}A{1,1 }A{1,2 }A{1,3 .... .... ....
005 007 009 011
: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
)3االخراج()deletion( or )pop
ففً البداٌه ٌكون المؤشر ( )topفً االسفل وكلما تم ادخال بٌان على الـ ٌ stackصعد المؤشر الى
االعلى فٌعتمد حجم الـ stackعلى موقع المؤشر ,فعندما ٌكون الـ stackفارؼا ً تكون قٌمة المؤشر
)5عند االدخال (ٌ )pushجب التأكد ان المؤشر لم ٌصل الى القٌمه العظمى
وعند تهٌئة الـ stackعلٌنا ان نعطً المؤشر قٌمه تدل على انه فارغ ونحدد الـ stackبـ sو itemب i
e
و ٌنتج لنا االطار وٌتم داخله جمٌع العملٌات وهو اٌضا ً ماٌُعرؾ بالـ arrayومعه المؤشر.
المختص بإنشاء ()stack *االطار ( )frameفً الخوارزمٌات ولؽات البرمجه هو الكود الخاص
والمؤشر والـ items
>Include<isotream.h
Stract stack
{
;Int top
;}
Strict stack
{
;Int top
;}s
Sعباره عن كائن نضع فٌه البٌانات وتوجد عملٌات تطبٌقٌه ستؤخذ الحقا ً تعتمد على االدخال
واالخراج.
لو افترضنا ان عناصر الـ stackتحتوي العناصر ] item[0] to item[99واٌضا ً ال ٌوجد لدٌنا سبب
بان نجعلها محدده فقط على نوع واحد من البٌانات ولكن نفرض اننا نحتاج عدة انواع من البٌانات مثالً
Float , char , intاو أٌا كانت نوع البٌانات التً سنعطٌها للـstack
{ int I val;
Float f val;
String c val;
}element;
Strict stack
Int top ;
Sp = s.item {s.top}
Switch (sp-etype)
}
15 سهام علً عامر
وعندما تكون الstackفارؼه ال تحتوي على عناصر نجعل ال 1-=topأي ()s. top=-1كود برمجً
;)If(s.top==-1
;)Return(nuII/Empty
Else
;)Return (item
;stack is empty
Else
إحتمالٌات (" )under flowوهً الوصول الى النهاٌه" توجب علٌنا دراسة عملٌة الـ popللعناصر
داخل الـ stackالذي قد ٌكون فارؼا وتجنب ذلك.
عند عمل مثل هذا الطلب عن طرٌق المستخدم ٌجب إظهار رساله للمستخدم تعلمه انه ال ٌوجد اي قٌم
وتخبره عن حالة ( )under flowهذا ٌحتم على الـ popان ٌؤدي الخٌارات الثالثه التالٌه:
)1اذا كان الـ stackفارؼا إطبع رسالة تحذٌر وأوقؾ التنفٌذ ()halt execution
If (empty (sp) );
Exit();
ps;
ps_top[88];
: ً اإلجراءات تكون كالتالpush وأول محاولة للـpest array وهذه تكون أسهل فً التطبٌق باستخدام مصفوفة
Return;
}
17 سهام علً عامر
pushإلى stackبزٌادة S.topبقٌمة واحدة. وهنا اإلجراء ٌجعل item x
ومن ثم ٌدخل قٌمة xإلى عناصر array sلكن تدخل معنا مشكلة overflowوأن تطفح الحاوٌة stackبـ itemsعن
المقدر له هنا ٌجب إظهار رسالة بذلك .
{
;)Exit(1
}else
;Return
;}
مالحظـــة:
= Infix A+B
=Postfix AB+
=Prefix +AB
حٌث ان operands=A,B
**مثــال:
*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 , $
%
*,/
-,+
≤>,<,≥,
|| && ,
)=(A+B) * (C-D
2)*+AB -CD
:** مثال
A$B*C-D+E/F/(G+H)
4)+-*$ABCD//EF +GH
:** مثال
=((A+B)*C-(D-E)) $ (F+G)
2) -*+ABC-DE$(+FG)
:TREE طريقة
1: (A+B) * (C-D)
A+B C-D
21 سهام علً عامر
*
+ -
A B C D
Per = *+AB-CD
Post = AB+CD-*
/ +
-
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
(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
R F
()queue
أما فً الـ ٌ queueكون من خالل Rearالذي ٌتحكم بالتهٌئه عندما تكون ( )R= -1 , F= 0وبذلك ٌتولد
لدٌنا قانون خاص بالـ queueوهو ) (R < Fعند التهٌئه
* )(Q =R – F + 1
2-0+1=3
f=0
فً stackاذا اردنا الحذؾ نجعل ال Topعند القٌمه المراد حذفها ثم نحذؾ فتنتقل قٌمة ال Topوعند
االضافه تزٌد قٌمة ال Top
:Queueعند الحذؾ تتزاٌد قٌمة frontوتبقى قٌمة rearثابته وعند االضافه تتزاٌد قٌمة rearوتبقى
frontثابته.
Int r, f ;
Pq rear= -1;
Pq front= 0;
{ (pq rear)++
{
{
)"Print f ("empty
; Return
}
Else
}
F
فال نستطٌع االضافه ألن المؤشر ٌشٌر الى االمتالء A اما اذا كان لدٌنا هذا الشكل
R
بحسب الترتٌب ولكنه فً الحقٌقه فا رغ .ولذلك نجد أن الحل فٌه عملٌة shiftلنقل العناصر وهذا ٌأخذ منا وقت
كبٌر وأٌضا جهد فً عمل codeوأٌضا ٌؤثر على مشكلة األسبقٌة ولذلك ظهرت لدٌنا . Queue circular
كما ذكرنا أن stackو Queueعبارة عن مصفوفا ت لها خصائصها واحتٌاجاتها من الناحٌة الخوارزمٌة ومن الناحٌة
البرمجٌة وقواعدها فً اإلدخال واإلخراج وعملٌة الحفظ للعناصر والتً تتم فً عناوٌن ثابتة فً الذاكرة . Indexوهنا
ٌأتً تمثٌل المصفوفات فً الذاكرة بطرٌقة دٌنامٌكٌة تسمى Dynamic representation
memory address
A 002 002 تمكنها من الحفظ واإلضافة وتمثل على شكل عُقد
info value 003 ) (nodeوكنا إذا أردنا تحدٌد حجم الـ stackوQueue
002 فال بد أن نحدده قبال وٌصبح هنا الحجم ثابت .
فكنا إذا أردنا إضافة عنصر ٌنشأ عقدة جدٌدة وهكذا .
Ptr node=^Node
Node=Record
]Name=string [20
ID=Int
End
^ :عندما ٌجد الـ compilerهذه العالمة فإنه ٌقوم بتعرٌفها الحقا على حسب لؽة البرمجة فً C++languageسٌتم
تعرٌفها فً جمٌع اللؽات على حسب اللؽة إال فً لؽة الباسكال فهو ٌعرؾ هذه العالمة محجوزة .
28 سهام علً عامر
(:Linkالرابط) ٌؤشر على nodeمن نفس النوع .
Nodeآخر. وفً المثال السابق نعرؾ الرابط linkبنفس ( Ptr Nodeبنفس المؤشر)فهو ٌحمل عنوان
ومن أجل إنشاء أول عُقدة نستخدم مُعرؾ جدٌد( )Newومن أجل تعبئة البٌانات سنكتب عبارة التعبئة ( first
;’.)^.Name=’A
Begin
)First (New
)1عند الحذؾ َتحذؾ العنصر فعلٌا من الذاكرة وال نستطٌع استرجعها .
)2لكل سلسلة ال بد أن ٌكون لها مؤشر ألول السلسلة وإذا فُقد الرابط ( )linkنفقد البٌانات وحٌنها تظهر لنا رسالة وهً
الذاكرة ممتلئة .
)3إذا خرجنا من البرنامج تبقى العناصر فً الذاكرة حاجز ًة مساحة إلى أن ٌتم حذفها على عكس المصفوفات
عند إؼالق البرنامج فإن البٌانات ُتحذؾ .
ولو قمنا بلؽة C++بتعرٌؾ رابط وعقدة جدٌدة ٌجب أن ٌحتوي هذا التعرٌؾ على ثالث نقاط أساسٌة :
{
;Int info
;*First, *last
وعند هذا التصرٌح ٌجب أن أنسب جمٌع المتؽٌرات إلٌه مثل :
إذا أردنا الحجز فً الذاكرة هذا ٌعنً أننا نرٌد أن نحجز فً مؤشر لو افترضنا .....
;Int *P
;)P=malloC(2
{
;Node *P
;return
}
Node *f
) ( F=get Node
{
;F=get Node
;f -<Link=null
;f-< Info=7
}
فً حالة أننا نرٌد إضافة عقدة جدٌدة للسابقة بحٌث أن تكون fهً األولى حٌث أن تكون العقد fهً األولى وتأخذ
دائما قٌم الجدٌدة والقٌم السابقة إدخالها تنزاح إلى العقد الجدٌدة .
)(a )(b
f p
7 8 7
)(c )(d
{
;P=get Node
;P->link=f
31 سهام علً عامر
;P=f
;f->info=8
}