
Korean: 
안녕하세요, Carrie Anne입니다. 
컴퓨터 과학 특강에 온 것을 환영합니다!
지난 시간에는 전통적인 알고리즘 몇 개를 배웠습니다. 
숫자를 정렬한다던가,
그래프에서 가장 짧은 거리를 찾기 같은것들이요.
하지만 데이터 알고리즘이 실행되는 데이터가 
어떻게 컴퓨터 메모리에서 저장되는지에 대해서는
자세히 이야기하지 않았습니다.
여러분은 여러분의 데이터가 John Green'의 기숙사의 옷과 음식, 종이들처럼 널브러져있길 원하진 않을 것입니다.
여러분은 여러분의 데이터가 John Green'의 기숙사의 옷과 음식, 종이들처럼 널브러져있길 원하진 않을 것입니다.
대신 우리는 데이터는 읽고 불러오기 쉽게
구조가 탄탄하고 잘 정리되어 있길 원합니다.
대신 우리는 데이터는 읽고 불러오기 쉽게
구조가 탄탄하고 잘 정리되어 있길 원합니다.
이걸 위해서 컴퓨터 과학자들은 
자료 구조라는 것을 사용합니다.
인트로
저번 화에 벌써 간단한 자료 구조 하나를 설명했습니다. "배열"
다른말로는 리스트나 벡터라고도 합니다.
이들은 메모리에 연속적으로 저장되어 있는 값입니다.
그래서 'j 는 5다' 같이 한 개의 변수에
한 개의 값을 저장하는것 대신,
여러 개의 숫자를 지정한 다음 
배열에 저장할 수 있습니다.
배열에 있는 특정한 값을 찾으려면
인덱스(목록)를 지정해 줘야 합니다.

Chinese: 
(｡･∀･)ﾉﾞ嗨，我是 Carrie Anne，欢迎收看十分钟速成课：计算机科学
上集我们讲了一些经典算法
比如给数组排序，找“图”里的最短路径
而上集我们没谈到的是
这些算法处理的数据是如何存储在计算机内存中的
你肯定不想数据像 John Green 的大学宿舍一样乱
到处都是食物，衣服和纸张
我们希望数据结构分明，便于读取
为此，计算机科学家们发明了“数据结构”！
我们上集介绍了一种基本数据结构：数组（Array）
数组在其它一些编程语言里也叫“列表”（list）或“向量”（Vector）
数组里的值一个个连续存储在内存里
所以不像之前一个变量里只存一个值（比如 j = 5）
我们可以把多个值（比如多个数字）存在一个数组变量里
为了拿出数组中某个值，我们必须指定一个下标（index）

Arabic: 
مرحبا، أنا كاري آن، ومرحبا بكم في الدروس المكثفة لعلوم الحاسوب!
الحلقة الأخيرة، ناقشنا عدد قليل من
الخوارزميات الكلاسكية ، مثل ترتيب  قائمة الأرقام
وإيجاد أقصر مسار في رسم بياني.
ما لم نتحدث عنه كثيرا هو كيفية تخزين بيانات البرامج في ذاكرة جهاز
الكمبيوتر
لا تريد البيانات الخاصة بك ان تكون مثل 
غرفة  نوم جون جرين في الكلية، مع الاكل واللباس
وأوراق متناثرة في كل مكان.
بدلا من ذلك، نريد بياناتنا أن تكون منظمة، اي أن تكون مرتبة ، مما يسمح للأشياء
ان تكون سهلة الاسترجاع والقراءة.
لهذا،  استخدام علماء الكمبيوتر هيكلة البيانات!
مقدمة
لقد قدمنا سابقا أحد أسس هيكلة البيانات , الجداول وتسمى كذلك قوائم أو ​​
اشعة  في بعض اللغات.
هذه هي سلسلة من القيم المخزنة في الذاكرة.
وذلك بدلا من مجرد قيمة واحدة يتم حفظها
إلى متغير، مثل 'ي يساوي 5، نحن
نستطيع تعريف سلسلة كاملة من أرقام، و
حفظ ذلك في متغير مجدول.
لتكون قادرة على العثور على قيمة خاصة في هذا
الجدول، يجب تحديد رقم تسلسلي.

English: 
Hi, I'm Carrie Anne, and welcome to Crash
Course Computer Science!
Last episode, we discussed a few example classic
algorithms, like sorting a list of numbers
and finding the shortest path in a graph.
What we didn’t talk much about, is how the
data the algorithms ran on was stored in computer
memory.
You don’t want your data to be like John
Green’s college dorm room, with food, clothing
and papers strewn everywhere.
Instead, we want our data to be structured,
so that it’s organized, allowing things
to be easily retrieved and read.
For this, computer scientists use Data Structures!
INTRO
We already introduced one basic data structure
last episode, Arrays, also called lists or
Vectors in some languages.
These are a series of values stored in memory.
So instead of just a single value being saved
into a variable, like ‘j equals 5’, we
can define a whole series of numbers, and
save that into an array variable.
To be able to find a particular value in this
array, we have to specify an index.

Chinese: 
大多数编程语言里，数组的下标都是以“0”开始
并且用方括号“[ ]”表示数组索引
如果我们想将数组“J” 的第一个和第三个元素相加
然后将结果存在变量“a”中，我们可以写一行这样的代码
数组存在内存里的方式十分易懂
为表述简便，假设编译器从内存位置“1000”开始存数组
数组里有7个数字，它们在内存里按顺序存放（如上图）
所以当我们写“J[0]”时，计算机会去内存位置“1000”
再加上“0”个补偿单位，得到地址 1000，然后拿该地址的值：5
如果我们写“J[5]”，程序会去内存位置“1000”
加上“5”个补偿单位，得到地址 1005，拿到值： 4
人们很容易混淆“数组中第5个数”和“数组中下标为5的数”
它们并不是一回事
记住，下标为 5 其实是数组中第 6 个数
因为数组下标是从 0 开始算的
数组是用途广泛的数据结构
因此几乎所有编程语言都自带了很多函数来处理数组

Arabic: 
تقريبا جميع لغات البرمجة تبدأ الجداول بالرقم تسلسلي 0، ويستخدم  كشكل عام قوسين مستطيلين
لتعيين استخدام الجدول
لذلك، مثلا ، إذا كنا نريد اضافة قيم
في المركزين الأول والثالث من الجدول
'ي'، وحفظ ذلك إلى  المتغير "أ" ،
نكتب سطرا من التعليمات البرمجية مثل هذا.
كيف لجدول أن يكون مخزن في الذاكرة 
هذا واضح جدا
ببساطة , لنقل أن المترجم اختار لنا في الذاكرة الموقع 1000
الجدول يحتوي على 7 أرقام وتكون مخزنة واحدة تلو الأخرى في الذاكرة كما ترون هنا
أي عندما نكتب "ي" ذو الرقم التسلسلي "0" , الحاسوب يتجه إلى الموقع 1000 في الذاكرة مع 0
إزاحة فنحصل على القيمة 5.
إذا أردنا استرداد " ي ذو الرقم التسلسلي 5"،
 برنامجنا يذهب للموقع 1000 في الذاكرة ،
مع إزاحة ب5 مراتب، وهو في هذه الحالة  نجد
القيمة 4.
من السهل الخلط بين عدد الخامس في
الجدول مع الرقم التسلسلي 5.
انهما مختلفان
تذكر أن العدد صاحب الرقم التسلسلي 5 هو السادس
في الجدول لأن الرقم الأول
هو صاحب الرقم التسلسلي 0.
الجداول كمعدلة للبيانات فهي عديدة الإستخدامات , تستعمل دائما ويوجد عدة تطبيقات
التي تجعلها تقوم بأمور مفيدة.

Korean: 
거의 모든 프로그래밍 언어에서
배열의 목록은 0 부터 시작합니다.
그리고 배열의 크기를 네모 괄호 [ ] 로 표현합니다.
예를 들어서,  'j' 배열 첫번째랑 세번째 자리에
값을 더해 변수 'a' 에 그걸 저장하고 싶다면
코드를 이렇게 써야될 것입니다.
a = j[0] + j[2]
배열이 메모리에 저장되는 방법은
매우 간단합니다.
간단하게, 컴파일러가 우리의 배열을
메모리 주소 1000에 저장했다고 가정합시다.
배열은 7개의 숫자를 가지고 있고,
보시다시피 메모리 상에서는 나란히 저장되어 있습니다.
우리가 "j [ 0 ]"를 찾는다면
컴퓨터는 메모리주소 1000에서 0으로 출발하여
값 5를 찾습니다.
우리가 'j [ 5 ]'를 찾고싶다면,
프로그램은 메모리주소 1000으로 가서
5를 더한 위치에서 값 4를 얻습니다.
배열에서 5번째 숫자랑 인덱스가 5인 숫자를
헷갈리기 쉽습니다.
둘은 전혀 다릅니다.
배열의 수는 0부터 시작하므로 인덱스가 5인 숫자는 
6번째 숫자라는걸 기억해야 합니다.
배열의 지수는 0부터 시작하므로 인덱스가 5인 숫자는 
6번째 숫자라는걸 기억해야 합니다.
배열은 매우 다양하게 사용되는 데이터 구조로
늘 사용되므로
유용한 것들을 다루는 많은 함수가 있습니다.

English: 
Almost all programing languages start arrays
at index 0, and use a square bracket syntax
to denote array access.
So, for example, if we want to add the values
in the first and third spots of our array
‘j’, and save that into a variable ‘a’,
we would write a line of code like this.
How an array is stored in memory is pretty
straightforward.
For simplicity, let’s say that the compiler
chose to store ours at memory location 1,000.
The array contains 7 numbers, and these are stored one after another in memory, as seen here.
So when we write “j index of 0”, the computer
goes to memory location 1,000, with an offset
of 0, and we get the value 5.
If we wanted to retrieve “j index of 5”,
our program goes to memory location 1000,
plus an offset of 5, which in this case, holds
a value of 4.
It’s easy to confuse the fifth number in
the array with the number at index 5.
They are not the same.
Remember, the number at index 5 is the 6th
number in the array because the first number
is at index 0.
Arrays are extremely versatile data structures,
used all the time, and so there are many functions
that can handle them to do useful things.

English: 
For example, pretty much every programming
language comes with a built-in sort function,
where you just pass in your array, and it
comes back sorted.
So there’s no need to write that algorithm
from scratch.
Very closely related are Strings, which are
just arrays of characters, like letters, numbers,
punctuation and other written symbols.
We talked about how computers store characters
way back in Episode 4.
Most often, to save a string into memory,
you just put it in quotes, like so.
Although it doesn’t look like an array,
it is.
Behind the scenes, the memory looks like this.
Note that the string ends with a zero in memory.
It’s not the character zero, but the binary
value 0.
This is called the null character, and denotes
the end of the string in memory.
This is important because if I call a function
like “print quote”, which writes the string
to the screen, it prints out each character
in turn starting at the first memory location,
but it needs to know when to stop!
Otherwise, it would print out every single
thing in memory as text.
The zero tells string functions when to stop.
Because computers work with text so often,
there are many functions that specifically
handle strings.
For example, many programming languages have
a string concatenation function, or “strcat”,

Korean: 
예를들어, 거의 모든 프로그래밍 언어는
배열을 입력만 하면
정렬이 되어서 나오는
정렬 기능이 내장되어 있습니다.
그래서 그 알고리즘을 맨 처음부터 쓸 필요는 없습니다.
매우 유사한 것으로 문자열은, 단지 문자나 숫자, 특수문자 등으로 만들어진 문자열입니다.
매우 유사한 것으로 문자열은, 단지 문자나 숫자, 특수문자 등으로 만들어진 문자열입니다.
4강에서 컴퓨터가 문자를 어떻게 저장하는지 
얘기 했었는데요.
주로 메모리에 배열을 저장할 때
옆에 보이는 것 처럼 쌍따음표 안에 넣습니다.
그렇게 안보이긴 하지만 배열이 맞습니다.
그 뒤의 메모리는 이렇게 생겼습니다.
메모리상에서 배열은 (zero) 로 끝납니다.
문자 0이 아니라 이진법 값 0입니다.
이걸 NULL 문자라고 하는데, 
이게 문자열의 끝을 나타냅니다.
이게 중요한 이유는, 만약 이 문자열을
'print quote'와 같은 함수로 출력한다고 하면
시작 메모리 주소부터 순서대로
출력을 하겠지만
언제 출력을 멈춰야 할지 알아야 합니다!
그렇지 않으면 메모리 안의 모든 문자를 출력하겠죠.
(zero) 는 문자열 함수가 언제 끝나는지 알려줍니다.
컴퓨터는 문자를 다룰 일이 너무 많기 때문에 
문자열만 다루는 함수가 굉장히 많습니다.
컴퓨터는 문자를 다룰 일이 너무 많기 때문에 
문자열만 다루는 함수가 굉장히 많습니다.
예를 들어, 많은 프로그래밍 언어는 두 문자열을 입력받아 두번째 문자열을 첫번째 문자열의 끝에 복사해주는

Chinese: 
举个例子，几乎所有编程语言都自带了排序函数，来排序数组
只需要传入数组，函数就会返回排序后的数组
所以你并不需要从头写排序算法
“字符串”（string）和数组十分相似
其实它就是字母/数字/标点符号等组成的数组
我们在第 4 集讨论过计算机如何存储字符
要把字符串存到内存里，用引号括起来就可以了（j = "STAN ROCKS"）
虽然它长的不像数组，但它的确是数组
底层的内存看起来像这样
记住字符串在内存里以“0”结尾
不是"字符0"，是"二进制值的0"，这叫字符"null"，表示字符串的结尾
这个字符非常重要，因为如果我调用一个"print"函数
"print"函数会在屏幕上输出字符串
它会从字符串的开始内存位置，逐个显示到屏幕上
但它得知道什么时候该停下来！
否则，它会把内存里所有东西都打印出来
这个“0”告诉函数何时停下
因为计算机经常处理文本
所以有很多专门处理字符串的函数
比如，很多编程语言里都有连接字符串的函数“strcat”

Arabic: 
على سبيل المثال، تقريبا كل لغات البرمجة تكون مصحوبة بتعليمات الترتيب مسبقا
حيث بمجرد إدخالك للجدول , ستحصل عليه مرتبا
لذلك ليس هنالك حاجة لكتابة خوارزمية
من الصفر.
سلاسل الرموز جد مشابهة لها , حيث أنها عبارة عن جداول من الرموز مثل الحروف , الأرقام
علامات الترقيم , والرموز الكتابية الأخرى.
تحدثنا في الحلقة 4 عن كيفية تخزين الحواسيب  للأحرف
في معظم الأحيان، لتخزين سلسلة الرموز  في الذاكرة،
يمكنك فقط وضعها بين "" .
على الرغم من أنها لا تبدو وكأنها جدول , لكنه كذلك
وراء الكواليس الذاكرة تكون هكذا
لاحظ أن السلسلة تنتهي مع صفر في الذاكرة.
انها ليست الرمزصفر، ولكن القيمة 0 في النظام الثنائي
وهذا ما يسمى بالرمز الخالي ، ويرمز إلى نهاية السلسلة في الذاكرة.
وهذا أمر مهم لأنه إذا إستخدمت تعليمة مثل
"إظهار المحتوى" الذي يكشف عن سلسلة الرموز
في الشاشة، فإنه يُظهر كل حرف
بالترتيب بداية من الموقع الأول في الذاكرة
ولكنه يحتاج إلى معرفة متى يتوقف!
من ناحية أخرى , فإنها يظهر كل شئ في الذاكرة على أساس أنه نص
الصفر يسمح للتعليمات الخاصة بسلاسل الرموز معرفة متى تتوقف
لأن أجهزة الكمبيوتر تتعامل مع النص في كثير من الأحيان،
هناك العديد من التطبيقات خاصة
بالتعامل مع سلاسل الرموز
مثلا ، العديد من لغات البرمجة لها
وظيفة دمج سلاسل الرموز، أو "strcat"

Arabic: 
التي تأخذ سلسلتين، ثم تنسخ
الثانية كليا وتضيفها إلى نهاية الأولى
يمكننا استخدام الجداول لصنع 
قوائم أحادية الأبعاد ، ولكن أحيانا تريد استخدام
البيانات ثنائية الأبعاد، مثل شبكة
الأرقام في برنامج الجدولة ، أو بكسل
على شاشة جهاز الكمبيوتر الخاص بك.
لهذا، نحن بحاجة إلى مصفوفات.
يمكنك التفكير في شكل مصفوفة على أنها جدول من الجداول!
حتى مصفوفة 3x3 هي في الحقيقة جدول من
الحجم 3، مع كل مؤشريخزن جدول من
الحجم 3.
يمكننا تحديد المصفوفة مثل ذلك
في الذاكرة، تكون مرصوصة مع بعضها هكذا
للوصول إلى قيمة ما ، تحتاج إلى تحديد مؤشرين، مثل "J ذو الرقم التسلسلي 2" ذو الرقم التسلسلي
1 " وهذا يحدد للكمبيوتر أننا نبحث عن عنصر في الجدول 2 في الموضع 1
وهذا  يعطي لنا قيمة 12
الشيء الجيد في المصفوفات هو أنها ليست محدودة في 3x3 , بل نستطيع إنشاء منها أي
حجم نريده - ويمكننا أيضا جعلها من
أي عدد من الأبعاد نريده .
على سبيل المثال، يمكننا إنشاء مصفوفة خماسية الأبعاد والوصول إليها هكذا
هذا صحيح، أنت تعرف الآن كيفية الوصول إلى
مصفوفة خماسية الأبعاد - أخبر أصدقائك!
حتى الآن، لقد كنا نخزن الأرقام و الحروف على إنفراد في جداولنا أو مصفوفاتنا

Chinese: 
“strcat” 接收两个字符串，然后把第二个字符串放到第一个的结尾
我们可以用数组做一维列表
但是有时你想操作二维的数据
比如电子表格，或屏幕上的像素
那么我们就需要 “矩阵”（Matrix）
你可以把矩阵看成  由数组组成的数组！
一个 3x3 矩阵就是一个长度为3的数组，数组里每个元素都是一个长度为3的数组
我们可以这样写一个矩阵
在内存里，它们是这样排列的
为了获取一个值，你需要指定两个下标，比如 J[2][1]
告诉计算机你在找 子数组 2 里，位置是 1 的元素
得到数字 12
矩阵酷的地方是我们不止能做 3x3 的矩阵
我们可以做任意长度，任意维度的矩阵
比如，我们可以创造一个5维矩阵，然后这样访问数据 a = j[2][0][18][18][3]
现在你知道怎么读取一个 5 维矩阵了
快去告诉你的朋友！
目前为止，我们在数组和矩阵里存了数字/字符

Korean: 
연속 문자열, 또는 'strcat' 라고 하는 
함수를 가지고 있습니다.
배열을 사용해서 1차원적 자료를 다룰 수 있지만,
스프레드시트의 표나 화면의 픽셀처럼 
2차원적으로 확장된 자료를  다루고 싶을 때도 있습니다.
스프레드시트의 표나 화면의 픽셀처럼 
2차원적으로 확장된 자료를  다루고 싶을 때도 있습니다.
이럴때는 매트릭스라는게 필요합니다.
매트릭스는 배열의 배열이라고 생각하면 됩니다.
3x3 매트릭스는 그냥 크기가 3인 배열이
3개 있는 것을 말합니다.
매트릭스는 이렇게 선언할 수 있습니다.
메모리상에서는 배열이 이렇게
순서대로 저장되어 있습니다.
특정 값에 접근하려면 인덱스 두개를 알려줘야 합니다.
예시로 'j [ 2 ] [ 1 ]' 를 찾는다면
2번째 배열에서 위치 1의 값을 구하는 것과 같습니다.
그렇게 값 12를 찾아낼 수 있습니다.
매트릭스의 장점은 3x3 크기의 배열에
제한되지 않는다는 것입니다.
우리가 만들고 싶은 크기나 차원으로 만들 수 있습니다.
예를 들어 5차원 배열을 만들고 싶다면
이렇게 선언해주면 됩니다.
맞아요, 여러분은 이제 5차원 배열을 만들 줄 압니다.
친구들에게 자랑하세요!
지금까지 우리는 배열에 숫자나
문자를 하나씩 저장했습니다.

English: 
which takes in two strings, and copies the
second one to the end of the first.
We can use arrays for making one dimensional
lists, but sometimes you want to manipulate
data that is two dimensional, like a grid
of numbers in a spreadsheet, or the pixels
on your computer screen.
For this, we need a Matrix.
You can think of a Matrix as an array of arrays!
So a 3 by 3 matrix is really 2 an array of
size 3, with each index storing an array of
size 3.
We can initialize a matrix like so.
In memory, this is packed together in order
like this.
To access a value, you need to specify two
indexes, like “J index of 2, then index
of 1” - this tells the computer you’re
looking for the item in subarray 2 at position 1.
And this would give us the value 12.
The cool thing about matrices is we’re not
limited to 3 by 3 -- we can make them any
size we want -- and we can also make them
any number of dimensions we want.
For example, we can create a five dimensional
matrix and access it like this.
That’s right, you now know how to access
a five dimensional matrix -- tell your friends!
So far, we’ve been storing individual numbers
or letters into our arrays or matrices.

Korean: 
하지만 가끔은 연관성 있는 자료를
연결해서 저장하는게 유용할 수도 있습니다.
은행 계좌번호랑 잔고를 같이 저장하는 것과 같이요.
보이는 바와 같이 변수의 그룹은 
Struct(구조체) 로 묶을 수 있습니다.
이제 단일 숫자가 아닌 여러 데이터를 한 번에 저장 가능한 복합 데이터로 된 변수를 만들어 낼 수 있습니다.
이제 단일 숫자가 아닌 여러 데이터를 한 번에 저장 가능한 복합 데이터로 된 변수를 만들어 낼 수 있습니다.
우리가 정의한 구조체 또한 배열로 만들어
자동으로 묶을 수도 있습니다.
우리가 'j [ 0 ]' 을 찾으려고 한다고 하면,
전체 구조체가 저장된 곳에서
우리가 원하는 계좌 번호랑 잔고 두 정보를 
다 찾아낼 수 있습니다.
구조체의 배열은 여느 배열처럼
만들어질 때 크기가 고정되고 더 확장하지 못합니다.
구조체의 배열은 여느 배열처럼
만들어질 때 크기가 고정되고 더 확장하지 못합니다.
게다가 배열은 메모리에 순서대로 저장되기 때문에 
중간에 새로운 값을 넣기 어렵습니다.
하지만 Struct 데이터 구조를 사용해서 보다 
복잡한 데이터 구조를 만드는 데 사용할 수 있습니다.
"node" 라는 이름의 구조체를 살펴봅시다.
이는 포인터임과 동시에 숫자와 같은 변수를 저장합니다.
포인터란,  메모리의 주소를 가리키는
특별한 변수를 말합니다.
이 구조체를 이용해서 노드를 여러 개 저장 할 수 있는 
유연한 구조체인 연결리스트를 만들 수 있습니다.
이 구조체를 이용해서 노드를 여러 개 저장 할 수 있는 
유연한 구조체인 연결리스트를 만들 수 있습니다.

Chinese: 
但有时把好几个有关系的变量存在一起会更有用
比如你可能想把银行账户号码和余额存在一起
这种打包成一组的多个变量叫“结构体”（Struct）
有了结构体，就能把多个不同类型数据存在一起
甚至可以做一个数组，然后里面包含好多结构体（struct）
这些数据会在内存里自动地打包在一起
如果我们写J[0]，就能拿到 J[0] 那里的结构体
就可以得到某个银行账户号码和余额
这种存结构体的数组，和其它数组一样
创建的时候就有固定大小，不能动态增加位置存更多值
还有，数组必须顺序存储在内存中
使得在数组中间插入一个新值非常困难
但结构体可以用来创造更复杂的数据结构，以消除这些限制
我们来看看这个叫“节点”（node）的结构体
节点（node）存一个变量和一个指针（pointer）
“指针”是一种特殊变量，存内存中的一个地址
利用 节点(node) ，可以创造出 "链表"（linked list）
链表是一种能存很多 "节点"（node） 的灵活数据结构

Arabic: 
ولكن في كثير من الأحيان من المفيد تخزين مجموعة من المتغيرات مع بعض
مثلا، تستطيع أن تخزن رقم حساب مصرفي
بالإضافة إلى الرصيد
مجموعات من المتغيرات مثل هذه يمكن تجميعها معا 
في  تسجيل واحد
الآن يمكننا إنشاء متغيرات  ليست
مجرد أرقام فردية ولكن بيانات مركبة
الهياكل  قادرة على تخزين عدة أنواع من
البيانات معا  في واحدة.
يمكننا إنشاء جداول خاصة بالتسجيلات التي نعرِّفها حيث تجمع مع بعضها تلقائيا
في الذاكرة.
إذا إستخدمنا مثلا, "ج ذو الرقم التسلسلي ل 0" نحصل على كل التسجيل المخزن هناك , و
يمكننا سحب رقم الحساب المعين و
بيانات الرصيد الذي نريد
هذا جدول من التسجبلات مثل أي جدول آخر ، 
يتم إنشاؤه  بحجم ثابت الذي لا يمكن
توسيعه لإضافة المزيد من العناصر.
أيضا، يجب تخزين الجداول مرتبة  في الذاكرة،
مما يجعل من الصعب إضافة عنصر جديد في الوسط
ولكن، بينة هيكلة البيانات يمكن استخدامها
لبناء هياكل البيانات أكثر تعقيدا
حيث تجنبنا هذه القيود
دعونا نلقي نظرة على هذه البنية التي
تسمى "عقدة"
يقوم بتخزين متغير، مثل العدد، وأيضا
مؤشر
المؤشر هو متغير خاص يشيرإلى موقع في الذاكرة ومن هنا جاءت تسميته،
باستخدام هذه البنية،  يمكن انشاء قوائم مترابطة بحيث تكون هيكل بياني مرن
يمكن تخزين العديد من العقد.

English: 
But often it’s useful to store a block of
related variables together.
Like, you might want to store a bank account
number along with its balance.
Groups of variables like these can be bundled
together into a Struct.
Now we can create variables that aren’t
just single numbers, but are compound data
structures, able to store several pieces of
data at once.
We can even make arrays of structs that we
define, which are automatically bundled together
in memory.
If we access, for example, J index of 0, we
get back the whole struct stored there, and
we can pull the specific account number and
balance data we want.
This array of structs, like any other array,
gets created at a fixed size that can’t
be enlarged to add more items.
Also, arrays must be stored in order in memory,
making it hard to add a new item to the middle.
But, the struct data structure can be used
for building more complicated data structures
that avoid these restrictions.
Let’s take a look at this struct that’s
called a “node”.
It stores a variable, like a number, and also
a pointer.
A pointer is a special variable that points,
hence the name, to a location in memory.
Using this struct, we can create a linked
list, which is a flexible data structure that
can store many nodes.

Arabic: 
ويتم ذلك من خلال وجود عند نهاية كل عقدة مؤشر للعقدة التالية في القائمة
دعونا نتصور لدينا ثلاثة عقد محفوظة في الذاكرة، في المواقع 1000، 1002 و 1008.
قد تكون بعيدة عن بعضها البعض، لأنه تم إنشاؤها في أوقات مختلفة، وغيرها من البيانات
يمكن أن تكون بينهما.
لذلك، ترون أن العقدة الأولى تحتوي على
القيمة 7، والموقع 1008 في المؤشر
القادم
وهذا يعني أن العقدة التالية في القائمة المربوطة  تواجدت في موقع الذاكرة 1008.
بملاحظة أسفل القائمة المربوطة، إلى العقدة الموالية، نرى أنه يخزن القيمة 112 و مؤشر
إلى عقدة أخرى في المكان 1002.
تبعا لذلك، نجد العقدة التي تحتوي على
القيمة 14 والمؤشر العائد إلى أول
عقدة في المكان 1000.
ومنه جعل من القائمة المربوطة حلقية، ولكن يمكن أيضا إنهاؤها
باستخدام قيمة المؤشرالقادم 0 -القيمة الخالية - التي من شأنها أن تشير أننا وصلنا الى
نهاية القائمة.
عندما يستخدم المبرمجون القوائم المربوطة  فإنهم نادرا ما ينظرون إلى القيم المخزنة في التالي من
المؤشرات.
بدلا من ذلك، يمكنهم  استخدام تجريد للقوائم المرتبطة، التي تبدو مثل هذا، وهو
أسهل بكثير للتصور.

Korean: 
이것은 각 노드가 목록의 다음 노드를 가리키도록 
함으로써 실행됩니다.
노드 구조체가 메모리 주소 1000, 1002, 1008
이렇게 세 군데에 저장되어있다고 가정해 봅시다.
각각 다른 시간에 만들어졌기 때문에 멀리 떨어져있고,
가운데 다른 데이터가 저장되어있을 수도 있습니다.
보시다시피 첫 노드에는 값 7이 저장되어 있고,
주소 1008이 그 "다음" 포인터입니다.
이것은 다음 노드가 연결리스트 안에서 
메모리 위치 1008에 있다는 것을 의미합니다.
이 연결된 배열을 따라가보면, 다음 위치에서는
값 112를 구할 수 있고
다음 노드는 1002 주소를 가리키고 있다는 것을 
알 수 있습니다.
그걸 또 따라가면 값 14를 구할 수 있고
다시 메모리 주소 1000으로
포인트 하고있다는걸 알 수 있습니다.
그렇게 이 연결 리스트는 원형이 되었습니다.
하지만 다음 포인터 값을 0(NULL)으로 해줌으로써 
연결리스트를 끝낼 수도 있습니다.
Null 값은 끝에 도달했다는 걸 나타냅니다.
프로그래머가 연결 리스트를 사용할 때는, 
다음 목록에 저장된 메모리 값을 거의 보지 못합니다.
대신 그림처럼 추상화된 연결 리스트를 사용해서
훨씬 쉽게 개념화 할 수 있습니다.
크기를 미리 지정해줘야 하는 배열과는 달리,

Chinese: 
它的灵活性是通过每个节点 指向 下一个节点实现的
想象我们有三个节点，分别存在内存“1000”，“1002”，“1008”
它们被隔开可能因为创建时间不同
其它数据存储在它们之间
你可以看到第一个节点的值是“7”，指向位置“1008”
代表下一个节点位于内存位置“1008”
现在来到下一个节点
我们发现值是112，指针指向“1002”
如果跟着它，会发现一个值为14的节点
指针指回内存位置为“1000”的第一个节点
这个链表叫循环链表
但链表也可以是非循环的，用一个“0”指针结束
“null”，这代表我们走到了列表的尽头
当程序员用链表时
很少看指针具体指向哪里
而是用链表的抽象模型，就像上图
这种模型更容易看懂
不像数组，大小需要预先定义好

English: 
It does this by having each node point to
the next node in the list.
Let’s imagine we have three node structs
saved in memory, at locations 1000, 1002 and 1008.
They might be spaced apart, because they were
created at different times, and other data
can sit between them.
So, you see that the first node contains the
value 7, and the location 1008 in its “next”
pointer.
This means that the next node in the linked
list is located at memory location 1008.
Looking down the linked list, to the next
node, we see it stores the value 112 and points
to another node at location 1002.
If we follow that, we find a node that contains
the value 14 and points back to the first
node at location 1000.
So this linked list happened to be circular,
but it could also have been terminated by
using a next pointer value of 0 -- the null
value -- which would indicate we’ve reached
the end of the list.
When programmers use linked lists, they rarely
look at the memory values stored in the next
pointers.
Instead, they can use an abstraction of a
linked list, that looks like this, which is
much easier to conceptualize.

Arabic: 
وخلافا للجداول التي لابد من تحديد حجمها مسبقا،
فالقوائم المرتبطة يمكن أن تكون قابلة للتمديد أو
التقصير.
على سبيل المثال، يمكننا تخصيص عقدة جديدة في
الذاكرة، وإدخاله إلى هذه القائمة
عن طريق تغيير المؤشرات التالية.
القوائم المرتبطة تكون سهلة في إعادة ترتيبها , توسيعها , عكسها وهكذا ....
وهذا جميل جدا!
ومفيد جدا لخوارزميات مثل الفرز،
الذي تحدثنا عنه الأسبوع الماضي.
بسبب هذه المرونة، تم بناء العديد من هياكل البيانات أكثر تعقيدا على رأس القوائم المرتبطة
الأكثر شهرة عالميا وهي queues  و stacks
Queue - مثل الطابور في مكتب البريد - يكون الترتيب حسب الوصول.
الشخص الذي كان ينتظر أطول،
يحصل على الخدمة أولا
بغض النظر عن مدى الإحباط  بحيث أنك
تريد فقط شراء طوابع بريدية والشخص
الذي أمامك يبدوأنه يريد إرسال 23 طرد
ولكن، بغض النظرهذا السلوك يسمى الحاضر أولا المغادر أولا أو FIFO
هذا هو الجزء الأول.
الأمر ليس متعلقا ب23 طرد
تخيل لدينا مؤشر،اسمه ( طابور مكتب البريد) ، الذي يشير إلى العقدة الأولى في
قائمتنا المرتبطة
وبمجرد أن تنتهي من خدمة هانك، يمكننا أن نقرأ
مؤشرهانك المقبل، ونحدث مؤشر
"طابور مكتب البريد " فيؤشر إلى الشخص الموالي في الطابور
لقد قمنا بنجاح بنزع هانك من القائمة , لقد ذهب تم ذلك , انتهى

English: 
Unlike an array, whose size has to be pre-defined,
linked lists can be dynamically extended or
shortened.
For example, we can allocate a new node in
memory, and insert it into this list, just
by changing the next pointers.
Linked Lists can also easily be re-ordered,
trimmed, split, reversed, and so on.
Which is pretty nifty!
And pretty useful for algorithms like sorting,
which we talked about last week.
Owing to this flexibility, many more-complex data structures are built on top of linked lists
The most famous and universal are queues and
stacks.
A queue – like the line at your post office
– goes in order of arrival.
The person who has been waiting the longest,
gets served first.
No matter how frustrating it is that all you
want to do is buy stamps and the person in
front of you seems to be mailing 23 packages.
But, regardless, this behavior is called First-In
First-Out, or FIFO.
That’s the first part.
Not the 23 packages thing.
Imagine we have a pointer, named “post office
queue”, that points to the first node in
our linked list.
Once we’re done serving Hank, we can read
Hank’s next pointer, and update our “post
office queue” pointer to the next person
in the line.
We’ve successfully dequeued Hank -- he’s
gone, done, finished.

Chinese: 
链表的大小可以动态增减
我们可以创建一个新节点，然后通过改变指针值，把新节点插入链表
链表也很容易重新排序，两端缩减，分割，倒序等等
超方便！
链表也适用于我们上集说的排序算法
因为灵活，许多复杂的数据结构都基于链表
其中最著名的是“队列”（queue）和“栈”（stack）
“队列”，就像邮局前排的队，谁先来谁排前面
"队列"，就像邮局前排的队，谁先来谁排前面
尽管你可能只想买个邮票，而你前面那个人要寄 23 个包裹
这种行为叫“先进先出”（FIFO）
我是指队列，不是指那 23 个包裹
想象我们有一个指针，名字叫“邮局队列”，指向链表第一个节点
第一个节点是 Hank，服务完 Hank 之后，我们可以读取 Hank 的指针
然后把“邮局队列”指向下一个人
这样我们就成功地将 Hank 从队列里“出队”（dequeue）了

Korean: 
연결리스트는 크기를 상황에 따라서 늘이거나 
줄일 수 있습니다.
예를 들어, 메모리에 새 노드를 할당하고
연결 리스트에 삽입할 수 있습니다.
단지 다음 포인터를 변경하는 것만으로요.
연결 리스트는 쉽게 순서를 바꾸거나, 간략화,
쪼개기, 뒤집기 등등이 가능합니다.
꽤 멋지죠!
저번 주에 설명했던 정렬 알고리즘에도
유용하게 쓰입니다.
이 유연성 덕분에,  더욱 더 복잡한 자료 구조들이 
연결 리스트의 위에 구축되었습니다.
가장 유명하고 보편적인 것은 줄과 스택입니다.
큐 - 우체국에 사람들이 줄을 서있는 것 처럼,
도착한 순서대로 들어갑니다.
가장 오래 기다리던 사람이
가장 먼저 서비스를 받습니다.
아무리 좌절한들, 여러분이 우표만 산다고 해도 앞사람이 23개의 소포를 부치는 것을 기다려야 한다는 말이죠.
아무리 좌절한들, 여러분이 우표만 산다고 해도 앞사람이 23개의 소포를 부치는 것을 기다려야 한다는 말이죠.
예시와는 관련 없이, 이런 현상을 FIFO, First-In First-Out
(먼저 들어온것이 먼저 나가는 것) 이라고 합니다.
그게 첫번째 부분입니다.
소포 23개 말구요.
연결 리스트의 첫 번째 노드를 가리키는 "Post office queue"  라는 포인터가 있다고 가정해 봅시다.
연결 리스트의 첫 번째 노드를 가리키는 "Post office queue"  라는 포인터가 있다고 가정해 봅시다.
Hank에게 서비스를 제공해 주고 나면, 
바로 뒤에 있던 사람의 포인터를 읽고
"Post office queue" 포인터를 
줄의 다음 사람으로 업데이트 할 수 있습니다.
행크는 성공적으로 줄에서 제거되었습니다. 
일 처리 다 했으니까 이제 볼 일 없죠.

Korean: 
만약에 누군가를 큐에 넣고 싶다면, 즉, 줄에 추가하려면
연결 리스트의 끝까지 가로질러 가서
마지막 사람의 포인터를 
다음 사람을 향해서 연결해 주면 됩니다.
작은 변화를 주면 연결 리스트를 LIFO 형식인
스택처럼 사용할 수 있습니다.
LIFO = Last-in First-out
(마지막으로 들어온것이 먼저 나간다.)
스택의 구조를 팬케잌 더미로 예를 들어 봅시다. 
하나의 팬케잌을 새로 만들 때 마다
더미 위에 하나씩 더 올립니다.
그리고 한개를 먹을 때 마다
위에서 하나씩 가져가서 먹습니다.
맛있어 보여요!
큐에 더하고 빼는 대신, 스택에서 데이터는 
Push로 추가가 되고 Pop으로 제거가 됩니다.
이것들이 공식 용어입니다!
우리가 노드 구조체를 
포인터 한 개 대신 두개를 갖게 한다면,
다양한 알고리즘에 쓰이는 '트리 구조'를
만들 수 있습니다.
다시 말하지만 프로그래머는 포인터의 값을
직접 볼 일이 거의 없기 때문에
대신 '나무'를 이렇게 개념화 할 수 있습니다.
가장 위에 있는 노드를 루트라고 합니다.
한 노드에서 뻗어져 나오는 노드들은
자식 노드라고 합니다.
예상했듯이 자식 노드 위의 노드들은 부모 노드입니다.
이 예시는 Thomas Jefferson이 Aaran Burr의 부모라는 것을 함축하나요?
그 결정은 당신의 팬픽션에 맡길게요. (농담)
마지막으로, 자식 노드가 없는 노드-
그러니까 맨 끝의 노드는 리프노드라고 합니다.

Arabic: 
إذا كنا نريد إضافة شخص إلى القائمة  , 
يكون هذا بإضافته إلى السلسلة ويجب علينا إجتياز كل
القائمة المرتبطة إلى أن نصل إلى النهاية، ثم نغير المؤشر القادم للإشارة إلى
الشخص الجديد.
مع تغيير صغير،يمككنا ربط القوائم ك stacks ,التي هي LIFO
أي الحاضر آخرا, المغادر أولا
يمكنك ان تتخيل مثل مجموعة من الفطائر .. مثلما تحضرها, فإنك تضيف كل مرة إلى أعلى
المجموعة
وعندما تريد أن تأكل واحدة، تأخذها من أعلى المجموعة
لذيذ!
بدلا من الإضافة والإزالة , البيانات
يتم ضغطها و سحبها من وإلى المجموعة
نعم، تلك هي شروط الرسمية!
إذا قمنا بتحديث بنية العقدة فتحتوي على أكثر من مؤشر واحد أي اثنين مثلا نستطيع صنع أشجار
بحيث يكون هيكل بيانات آخر الذي يتم استخدامه في العديد من الخوارزميات
مرة أخرى، من النادر للمبرمجين النظر في قيم المؤشرات , بدلا من تصور
الأشجار مثل هذا: ويطلق على أعلى عقدة بعقدة الجذر.
والعقد التي تخرج عن العقد الأخرى تسمى بالعقد الأطفال
كما تتوقع، العقد التي تكون فوق الأطفال
تسمى العقد الأم.
هل يعني هذا المثال أن توماس جيفرسون
هو والد آرون بور؟
سأترك ذلك لخيالك لاتخاذ قرار.
وأخيرا، العقد التي ليس لها أطفال حيث ينتهي الشجرة تسمى عقدة ورقية

English: 
If we want to enqueue someone, that is, add
them to the line, we have to traverse down
the linked list until we hit the end, and
then change that next pointer to point to
the new person.
With just a small change, we can use linked
lists as stacks, which are LIFO…
Last-In First-Out.
You can think of this like a stack of pancakes...
as you make them, you add them to the top
of stack.
And when you want to eat one, you take them
from the top of the stack.
Delicious!
Instead of enqueueing and dequeuing, data
is pushed onto the stack and popped from the stacks.
Yep, those are the official terms!
If we update our node struct to contain not
just one, but two pointers, we can build trees,
another data structure that’s used in many
algorithms.
Again, programmers rarely look at the values
of these pointers, and instead conceptualize
trees like this:
The top most node is called the root.
And any nodes that hang from other nodes are
called children nodes.
As you might expect, nodes above children
are called parent nodes.
Does this example imply that Thomas Jefferson
is the parent of Aaron Burr?
I’ll leave that to your fanfiction to decide.
And finally, any nodes that have no children -- where the tree ends -- are called Leaf Nodes.

Chinese: 
如果我们想将某人“入队”（enqueue），"入队"的意思是加到队列里
我们必须遍历整个链表，到达链表末尾
然后将链表最后的指针，指向新来的人（Nick）
只需要稍作修改，我们就能用链表做"栈"，栈是后进先出，简称 LIFO
你可以把"栈"想成一堆松饼
你做好一个新松饼，就堆在之前做好的松饼上面
当你开始吃时，是从最上面开始吃
美味！
用栈的时候我们就不叫"入队""出队"了
叫"入栈"（push） "出栈"（pop）
对，这些的确是官方术语！
如果我们把节点(node) 改一下，改成有两个指针
就能创造“树”（tree）
"树" 这种数据结构有很多算法在用
同样，程序员通常也不看指针的值
而是把“树”抽象成这样：最高层的节点叫“根节点”（root）
"根节点"之下的都叫“子节点”（children）
你可能已经猜到了子节点的直属上层，叫“父节点”（parent node）
这个例子能说明 托马斯·杰斐逊 是 阿龙·伯尔 的父亲吗？
我会让你们的同人文来决定的
没有任何“子节点”的节点
也就是“树”结束的地方，叫“叶节点”（leaf）

English: 
In our example, nodes can have up to two children,
and for that reason, this particular data
structure is called a binary tree.
But you could just as easily have trees with
three, four or any number of children by modifying
the data structure accordingly.
You can even have tree nodes that use linked
lists to store all the nodes they point to.
An important property of trees – both in
real life and in data structures – is that
there’s a one-way path from roots to leaves.
It’d be weird if roots connected to leaves,
that connected to roots.
For data that links arbitrarily, that include
things like loops, we can use a graph data
structure instead.
Remember our graph from last episode of cities
connected by roads?
This can be stored as nodes with many pointers,
very much like a tree, but there is no notion
of roots and leaves, and children and parents…
Anything can point to anything!
So that’s a whirlwind overview of pretty
much all of the fundamental data structures
used in computer science.
On top of these basic building blocks, programmers
have built all sorts of clever variants, with
slightly different properties -- data structures
like red-black trees and heaps, which we don’t
have time to cover.
These different data structures have properties
that are useful for particular computations.

Chinese: 
在我们的例子中，节点最多只可以有 2 个子节点
因此这种数据结构叫 “二叉树”（binary tree）
但你也可以改数据结构，让节点有3个，4个，甚至更多子节点
你甚至可以用链表来存某个节点的所有子节点
"树"的一个重要性质是（不管现实中还是数据结构中）
从“根”到“叶”的路径是单向的
如果根能连到叶，叶直接连到根  就很奇怪
如果数据随意连接，有些地方有循环
我们可以用数据结构“图”来表示
还记得上集中通过路来连接城市的“图”吗？
这种结构可以用多个指针的节点表示
因此没有“根”“叶”“子节点”“父节点”这些概念
任何东西都可以相互连接！
以上就是对计算机科学中，最主要的数据结构的概述
在这些基本结构之上
程序员创造了很多有不同性质的变体数据结构
比如“红黑树”和“堆”，我们没时间讲
不同数据结构适用于不同计算场景

Arabic: 
في هذا المثال، يمكن للعقد أن تحصل على طفلين،
ولهذا السبب، هيكل
البيانات هذا, يدعى شجرة ثنائية.
ويمكنك بسهولة الحصول على شجرة بثلاثة, 
 أربع ,أو أي عدد من أطفال مع تعديل
هيكل البيانات تبعا
يمكنك كذلك الحصول على شجرة العقد التي تستعمل القوائم المرتبطة لتخزين العقد التي تشير إليها
خاصية  هامة  في الأشجار - سواء في
الواقع أو في هيكلة البيانات هو أن
هناك مسار الإتجاه الواحد من الجذور إلى الأوراق.
من غريب أن ترتبط الجذور بالأوراق المتصلة بالجذور،
البيانات التي تربط بشكل عشوائي ، والتي تشمل
أشياء مثل التعليمات التكرارية ، يمكننا استخدام الرسم البياني
كهيكلة بدلا من ذلك.
هل تذكر رسمنا البياني للمدن المرتبطة بطرق في الحلقة السابقة ؟
يمكن لها أن تخزن كعقد مع العديد من المؤشرات،
تشبه إلى حد كبير الشجرة ولكن لا يوجد أي  مفهوم
للجذور والأوراق، والأطفال والأولياء ...
أي شيء يمكن أن يشير إلى أي شيء!
ولهذا لمحة شاملة للعديد من 
أساسية هياكل البيانات
المستخدمة في علم الحاسوب.
على رأس هذه البنيات الأساسية، المبرمجين قاموا ببناء
كل أنواع المتغيرات الذكية، مع
خصائص مختلفة قليلا - هياكل البيانات
مثل red-black trees و heaps  ، ونحن لا
نملك الوقت للتغطية
هذه هياكل البيانات المختلفة لها خصائص مفيدة لحسابات معينة.

Korean: 
이 예시를 보면 한 노드는 
두 개 까지의 자식을 가질 수 있습니다.
그렇기 때문에 이 구조체는 이진 트리라고 합니다.
하지만 상황에 맞게 자료 구조를 수정함으로써 트리의 자식 노드 수를 3이나 4 또는 임의의 수로 늘릴 수 있습니다.
하지만 상황에 맞게 자료 구조를 수정함으로써 트리의 자식 노드 수를 3이나 4 또는 임의의 수로 늘릴 수 있습니다.
심지어 연결 리스트를 써서 그들이 가리키는 모든 노드를 저장하는 트리 노드도 만들 수 있습니다.
트리구조에서 중요한 것은 
- 현실과 자료구조에서 -
바로 뿌리에서 잎까지 하나의 길이 존재한다는 것입니다.
뿌리가 나뭇잎이랑 연결되어있고
또 뿌리랑 연결되면 이상하겠죠.
무한 루프와 같이 제멋대로 연결되는 자료들은, 대신 그래프 데이터 구조를 사용합니다.
무한 루프와 같이 제멋대로 연결되는 자료들은, 대신 그래프 데이터 구조를 사용합니다.
저번시간에 설명했던 그래프를 기억하나요?
도시가 도로로 연결된 예시 였습니다.
이건 트리처럼 많은 포인터를 가지고 있는 
노드로 저장할 수 있지만
루트나 리프, 부모와 자식에 대한 개념은 없습니다.
무엇이던지 아무거나 포인터로 가리킬 수 있죠!
이상 모든 기본적인 자료 구조에 대한 
소용돌이치듯 한 개요였습니다.
이 기본적인 뼈대 위에, 프로그래머들은 약간 다른 모든 종류의 똑똑한 변형을 만들었습니다.
힙이나 Red-Black 트리와 같은 자료구조들이요.
다 이야기 하기에는 시간이 없네요.
각각 다른 자료구조는 
특정 계산에 유용한 속성을 가지고 있습니다.

English: 
The right choice of data structure can make
your job a lot easier, so it pays off to think
about how you want to structure your data
before you jump in.
Fortunately, most programming languages come with libraries packed full of ready-made data structures.
For example, C++ has its Standard Template
Library, and Java has the Java Class Library.
These mean programmers don’t have to waste
time implementing things from scratch, and
can instead wield the power of data structures
to do more interesting things, once again
allowing us to operate at a new level of abstraction!
I’ll see you next week.

Chinese: 
选择正确的数据结构会让工作更加简单
所以花时间考虑用什么数据结构是值得的
幸运的是，大多数编程语言自带了很多做好的数据结构
比如，C++有“标准模板库”，Java有“Java 类库”
这样程序员就不用浪费时间从零写
可以把时间花在用数据结构做更多有趣的事
使得我们可以再次提升一层抽象！
我们下周见！

Korean: 
알맞는 데이터 구조의 선택은 
여러분의 일을 매우 쉽게 만들어 줍니다.
그러므로 실전으로 돌입하기 전에
이런 이론을 배워두는게 정말 중요합니다.
다행히 많은 프로그래밍 언어는 라이브러리에 이미 만들어진 자료구조들로 가득 차 있습니다.
예를들어 C++는 Standard Template Library가 있고
자바는 Java Class Library 가 있습니다.
이건 우리가 프로그램을 맨 처음부터 만드느라
시간을 낭비하지 않아도 된다는 뜻이고
대신 자료구조의 힘을 사용해서
 더 흥미로운 일을 할 수 있습니다. 다시 한번 ,
새로운 추상화의 레벨로 올라갑니다!
다음주에 만나요.

Arabic: 
والاختيار المناسب لهيكل البيانات يجعل من عملك
أسهل كثبرا ، مما يدفعك إلى التفكير
حول الطريقة التي تريد أن تنظم بها البيانات الخاصة بك قبل أن تبدأ  فيها
لحسن الحظ، معظم لغات البرمجة تأتي
 مع مكتبات معبأة بالكامل بهياكل البيانات الجاهزة.
على سبيل المثال، ++C لديه مكتبة قوالب عامة و جافا لديها مكتبة قالب الجافا
هذه  يعني أن المبرمجين ليس عليهم إضاعة الوقت في برمجة أشياء من الصفر
ويمكن بدلا من ذلك استخدام القدرة الهائلة لهياكل البيانات لفعل أشياء أكثر إثارة للاهتمام، مرة أخرى
تتيح لنا العمل على مستوى جديد من التجريد!
اراكم الاسبوع المقبل.
