วันอังคารที่ 28 กรกฎาคม พ.ศ. 2552

Stack ในชีวิตประจำวัน

Stack ในชีวิตประจำวัน
stack คุณสมบัติของสแตก คือ ใส่ข้อมูลหลังสุดแต่จะถูกนำออกมาใช่ก่อนเป็นอันดับแรก เรียกว่า "last in first out"
ในชีวิตประจำวันของเราก็จะมีการใช้สแตกกัน ตัวอย่างเช่น
การสวมใส่เสื้อผ้าหลาย ๆ ชิ้น ชุดชั้นในจะถูกสวมใส่เป็นอันดับแรก ตามด้วยเสื้อผ้าชั้นนอกทีละตัว และเมื่อต้องการถอดเสื้อผ้าออกก็จะต้องถอดออกทีละตัวเช่นกัน โดยเสื้อผ้าที่อยู่ชั้นนอกสุดซึ่งใส่เป็นอันดับสุดท้ายจะต้องถูกถอดออกก่อนเป็นอันดับแรก
ไม้เสียบลูกชิ้นปิ้ง นำลูกชิ้นทีละลูกเสียบจากปลายด้านที่แหลมของไม้แล้วนำไปปิ้งเมื่อต้องการรับประทานจะนำออกจากปลายด้านเดียวกันเพื่อรับประทานทีละลูก
เทปกาวสองหน้า เพราะเทปกาวจะม้วนๆกันเข้าไปแต่ตอนเราใช้มักจะต้องเอาตรงปลายของมันที่อยู่ข่างนอกมาใช้ก่อน
หนังสือพิมพ์ในร้านค้า หนังสือพิมพ์ชนิดเดียวกันจัดให้อยู่ในแถวเดียวกัน ก็จะนำอันที่อยู่ข้างบนสุดออกมาก่อน

DTS 05 22/7/52

STACK
สแตก(stack) เป็นโครงสร้างข้อมูลที่ข้อมูลแบบลิเนียร์ลิสต์ ที่มีคุณสมบัติที่ว่า การเพิ่มลบข้อมูลในสแตก จะกระทำที่ ปลายข้างเดียวกัน ซึ่งเรียกว่า top ของสแตก และลักษณะที่สำคัญของสแตก คือข้อมูลที่ใส่หลังสุดจะนำออกมาจะออกมาจากสแตกเป็นลำดันแรกสุด เรียกคุณสมบัตินี้ว่า lifo(last in first out) ตัวอย่างคือ ขายของที่เก็บไว้ ก่อนที่จะขายของที่เพิ่งซื้อมาในตอนนี้
การทำงานของสเแตกประกอบด้วยกระบวนการ 3 กระบวการ คือ 1.push คือ การนำข้อมูลใส่ลงไปในสแตกเช่น สแตก s ต้องการใส่ข้อมูล i ในสแตก
จะได้ push (s,i) ในการเพิ่มข้อมูลในสแตกจะต้องทำการว่าสแตกเต็มหรือไม่ ถ้าไม่เต็มก็สามารถเพิ่มได้ ถ้าสแตกเต็ม(stack overflow)ก็ไม่สามารถเพิ่มข้อมูลไปในแสตกได้อีก 2.pop คือ การนำข้อมูลออกจาส่วนบนสุดของสแตก การนำข้อมูลออกจากสแตก ถ้าสแตกมีสมาชิคเพี่ยง 1 ตัวแล้วนำสมาชชิคออกจากสแตก จะเกิดสภาวะว่าง (stack empty) คือ ไม่มีสมาชิคอยู่ในสแตกเลย แต่ถ้ามีสมาชิคแล้วทำการ pop สแตก จะทำให้เกิดความผิดพลาดเรียกว่า stack underflow 3. stack top เป็นการคัดลกข้อมูลอยู่บนสุดของสแตก แต่ไม่ได้นำข็อมูลนั้นออกจาสแตก

DTS04 15/7/52

ลิงค์ลิสต์ (Linked List) เป็นวิธีการเก็บข้อมูลอย่างต่อเนื่องของอิลิเมนต์ต่าง ๆโดยมีพอยเตอร์เป็นตัวเชื่อมต่อ แต่ละอิลิเมนท์ เรียกว่าโนด (Node)ซึ่งในแต่ละโนดจะประกอบไปด้วย 2 ส่วน คือส่วนที่หนึ่ง คือ Data จะเก็บข้อมูลของอิลิเมนท์และส่วนที่สอง คือ Link Field จะทำหน้าที่เก็บตำแหน่งของโนดต่อไปในลิสต์ในส่วนของ data อาจจะเป็นรายการเดี่ยวหรือเป็นเรคคอร์ดก็ได้ในส่วนของ link จะเป็นส่วนที่เก็บตำแหน่งของโหนดถัดไป ในโหนดสุดท้ายจะเก็บค่า Nullซึ่งไม่ได้ชี้ไปยังตำแหน่งใด ๆ เป็นตัวบอกการสิ้นสุดของลิสต์โครงสร้างข้อมูลแบบลิงค์ลิสต์จะแบ่งเป็น 2 ส่วน คือ1. Head Structure จะประกอบไปด้วย 3 ส่วนได้แก่ จำนวนโหนดในลิสต์ (Count)พอยเตอร์ที่ชี้ไปยังโหนดที่เข้าถึง (Pos) และพอยเตอร์ที่ชี้ไปยังโหนดข้อมูลแรกของลิสต์ (Head)2. Data Node Structure จะประกอบไปด้วยข้อมูล(Data) และพอยเตอร์ที่ชี้ไปยังข้อมูลตัวถัดไป

วันอังคารที่ 14 กรกฎาคม พ.ศ. 2552

DTS03 01/07/52

สรุปการเรียน
pointer เป็นตัวแปรชนิดหนึ่งที่ทำหน้าที่เก็บตำแหน่งที่อยู่(Address)ของตัวแปรที่อยู่ในหน่อยความจำ
การประกาศชนิดของตัวแปรพอยน์เตอร์
รูปแบบของ pointer type *variable-name
type หมายถึง ชนิดของตัวแปร
* หมายถึง เป็นเครื่องหมายที่แสดงว่า ตัวแปรที่
ตามหลังเครื่องหมายนี้เป็นตัวแปรพอยน์เตอร์
ได้รู้ถึงเครื่องหมายที่ใช้งานกับตัวแปรพอยเตอร์
1.เครื่องหมาย& เป็นเครื่องหมายที่ใช้เมื่อต้องการให้เอาค่าตำแหน่งที่อยู่ของตัวแปรที่
เก็บไว้ในหน่วยความจำออกมาใช้
2. เครื่องหมาย *
มีการใช้งาน 2 ลักษณะ คือ
􀂾 ใช้ในการประกาศ peremeter ว่าเป็นตัวแปรแบบพอยน์เตอร์
ใช้เป็น dereferencing operater จะใช้เมื่อต้องการนำค่าที่อยู่ใน
ตำแหน่งที่ตัวแปรพอยน์เตอร์นั้นชี้อยู่
ออกมาแสดง

แบบฝึกหัดบทที่2

1.ให้นักศึกษากำหนดค่าของ Array 1 มิติ และ Array 2 มิติ
Array 1 มิติ
int name[10]; กำหนดค่าให้ใส่ตัวอักษร 10 หลัก
ตัวอย่าง
#include "stdio.h"
void main()
{
char name[10];
printf ("What is your name?\n");
scanf ("%s", name);
printf ("You are %s. \n", name);
}
Array 2 มิติ
int table[4][4];
เราก็จะได้อาเรย์ชื่อ table มี 4 แถว แถวละ 4 ตัว(เรียกว่า"แถวละ 4 คอลัมน์")
#include "stdio.h"
main()
{
int table[4][4];
table[0][0] = 0;
table[0][1] = 0;
table[0][2] = 0;
table[0][3] = 0;
table[1][0] = 0;
table[1][1] = 1;
table[1][2] = 2;
table[1][3] = 3;
table[2][0] = 0;
table[2][1] = 2;
table[2][2] = 4;
table[2][3] = 6;
table[3][0] = 0;
table[3][1] = 3;
table[3][2] = 6;
table[3][3] = 8;
printf("%d"table[3][2]);
scanf(" ");
return 0;
}
2.ให้นักศึกษา หาค่าของ A[2],A[6] จากค่า A={2,8,16,24,9,7,3,8}
ค่าของ A[2]= 16
ค่าของ A[6]=3
3. จากค่าของ int a[2][3]={{6,5,4},{3,2,1}}; ให้นักศึกษาหาค่าของ a[1][0] และ a[0][2]
ค่าของ a[1][0]=3
ค่าของ a[0][2]=4
4. ให้นักศึกษากำหนด structure ที่มีค่าของข้อมูลจากน้อย 6 Records
#include"stdio.h"
struct student
{
char name[20];
char lastname[20];
int id;
char faculty[30];
char section[5];
char university[30];
}student;
void input_data()
{
printf("resume\n");
printf("name: ");
scanf("%s",&student.name);
printf("lastname: ");
scanf("%s",&student.lastname);
printf("id: ");
scanf("%d",&student.id);
printf("faculty: ");
scanf("%s",&student.faculty);
printf("section: ");
scanf("%s",&student.section);
printf ("university: ");
scanf("%s",&student.university);

}
void show_data()
{
printf("name: ");
printf("%s\n",student.name);
printf("lastname: ");
printf("%s\n",student.lastname);
printf("id: ");
printf("%d\n",student.id);
printf("faculty: ");
printf("%s\n",student.faculty);
printf("section: ");
printf("%s\n",student.section);
printf("university: ");
printf("%s\n",student.university);

}
main()
{
input_data();
show_data();
}
5. ให้นักศึกษาบอกความแตกต่างของการกำหนดตัวชนิด Array กับตัวแปร Pointer ในสภาพของการกำหนดที่อยู่ของข้อมูล
pointer จะใช้พื้นที่มากกว่า array เพราะต้องเพิ่มพื้นที่ส่วนหนึ่งสำหรับเก็บตำแหน่งที่อยู่ของข้อมูลตัวถัดไป
array เป็นตัวแปรชุดที่ใช้เก็บตัวแปรชนิดเดียวกันไว้ด้วยกัน
pointer เป็นตัวเก็บตำแหน่งที่อยู่ของหน่วยความจำ (Address) หรือเรียกว่า ตัวชี้