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

DTS06-28/07/2552

สรุปเรื่อง สแตก (ต่อ)

การใช้ สแตค เพื่อแปลรูปนิพจน์ทางคณิตศาสตร์
รูปแบบนิพจน์ทางคณิตศาสตร์
• นิพจน์ Infix คือ นิพจน์ที่เครื่องหมายดำเนินการ (Operator) อยู่ระหว่างตัวดำเนินการ (Operands) เช่น A+B-C
• นิพจน์ Prefix คือ นิพจน์ที่เครื่องหมายดำเนินการ (Operator) อยู่หน้าตัวดำเนินการ (Operands) เช่น +-AB
• นิพจน์ Postfix คือ นิพจน์ที่เครื่องหมายดำเนินการ (Operator) อยู่หลังตัวดำเนินการ (Operands) เช่น AC*+

การแปลงจาก infix เป็น postfix Stack มีการทำงานแบบ LIFO ถูกนำมาอธิบายการทำงานของการแปลงจาก infix เป็น postfix อยู่เสมอ โดยพิจารณาน้ำหนักของเครื่องหมายในนิพจน์ และเครื่องหมายที่ถูกกระทำก่อนไปหลังคือ
1. วงเล็บ Parenthesis ()
2. ยกกำลัง Exponentiation ^ (Left to Right)
3. คูณและหาร Multiplication *, Division / (Left to Right)
4. บวกและลบ Addition +, Subtraction - (Left to Right)


กฎเกี่ยวกับการแปลง
1. ถ้าข้อมูลเข้า (input) เป็นตัวถูกดำเนินการ (operand) ให้นำออกไปเป็นผลลัพธ์ (output)
2. ถ้าข้อมูลเข้าเป็นตัวดำเนินการ (operator) ให้ดำเนินการดังนี้
2.1 ถ้าสแตคว่าง ให้ push operator ลงในสแตค
2.2 ถ้าสแตคไม่ว่าง ให้เปรียบเทียบ operator ที่เข้ามากับ operator ที่อยู่ในตำแหน่ง TOP ของสแตค
2.2.1 ถ้า operator ที่เข้ามามีความสำคัญมากกว่า operator ที่ตำแหน่ง TOP ของสแตคให้ push ลงสแตค
2.2.2 ถ้า operator ที่เข้ามามีความสำคัญน้อยกว่าหรือเท่ากับ operator ที่อยู่ในตำแหน่ง TOP ของสแตค ให้ pop สแตคออกไปเป็นผลลัพธ์ แล้วทำการเปรียบเทียบ operator ที่เข้ามากับ operator ที่ตำแหน่ง TOP ต่อไป จะหยุดจนกว่า operator ที่เข้ามาจะมีความสำคัญมากกว่า operator ที่ตำแหน่ง TOP ของสแตค แล้วจึง push operator ที่เข้ามานั้นลงสแตค
3. ถ้าข้อมูลเข้าเป็นวงเล็บเปิด ให้ push ลงสแตค
4. ถ้าข้อมูลเข้าเป็นวงเล็บปิด ให้ pop ข้อมูลออกจากสแตคไปเป็นผลลัพธ์จนกว่าจะถึงวงเล็บ เปิด จากนั้นทิ้งวงเล็บเปิดและปิดทิ้งไป
5. ถ้าข้อมูลเข้าหมด ให้ pop ข้อมูลออกจากสแตคไปเป็นผลลัพธ์จนกว่าสแตคจะว่าง

วันพุธที่ 22 กรกฎาคม พ.ศ. 2552

DTS05-22/07/2552

สรุปบทเรียน Linked ListและStack

Linked List (ต่อ)
กระบวนงานและฟังก์ชั่นที่ใช้ดำเนินงานพื้นฐาน
1. กระบวนงาน Create Listหน้าที่ สร้างลิสต์ว่างผลลัพธ์ ลิสต์ว่าง
2. กระบวนงาน Insert Nodeหน้าที่เพิ่มข้อมูลลงไปในลิสต์บริเวณตำแหน่งที่ต้องการข้อมูลนำเข้า ลิสต์ ข้อมูล และตำแหน่งผลลัพธ์ ลิสต์ที่มีการเปลี่ยนแปลง
3. กระบวนงาน Delete Nodeหน้าที่ ลบสมาชิกในลิสต์บริเวณตำแหน่งที่ต้องการข้อมูลนำเข้า ข้อมูลและตำแหน่งผลลัพธ์ ลิสต์ที่มีการเปลี่ยนแปลง
4. กระบวนงาน Search listหน้าที่ ค้นหาข้อมูลในลิสต์ที่ต้องการข้อมูลนำเข้าลิสต์ผลลัพธ์ ค่าจริงถ้าพบข้อมูล ค่าเท็จถ้าไม่พบข้อมูล
5. กระบวนงาน Traverseหน้าที่ ท่องไปในลิสต์เพื่อเข้าถึงและประมวลผลข้อมูลนำเข้าลิสต์ผลลัพธ์ ขึ้นกับการประมวลผล เช่นเปลี่ยนแปลงค่าใน node , รวมฟิลด์ในลิสต์ ,คำนวณค่าเฉลี่ยของฟิลด์ เป็นต้น
6. กระบวนงาน Retrieve Nodeหน้าที่ หาตำแหน่งข้อมูลจากลิสต์ข้อมูลนำเข้าลิสต์ผลลัพธ์ ตำแหน่งข้อมูลที่อยู่ในลิสต์
7. ฟังก์ชั่น EmptyListหน้าที่ ทดสอบว่าลิสต์ว่างข้อมูลนำเข้า ลิสต์ผลลัพธ์ เป็นจริง ถ้าลิสต์ว่างเป็นเท็จ ถ้าลิสต์ไม่ว่าง
8. ฟังก์ชั่น FullListหน้าที่ ทดสอบว่าลิสต์เต็มหรือไม่ข้อมูลนำเข้าลิสต์ผลลัพธ์ เป็นจริง ถ้าหน่วยความจำเต็มเป็นเท็จ ถ้าสามารถมีโหนดอื่น
9. ฟังก์ชั่น list countหน้าที่ นับจำนวนข้อมูลที่อยู่ในลิสต์ข้อมูลนำเข้าลิสต์ผลลัพธ์ จำนวนข้อมูลที่อยู่ในลิสต์
10. กระบวนงาน destroy listหน้าที่ ทำลายลิสต์ข้อมูลนำเข้า ลิสต์ผลลัพธ์ ไม่มีลิสต์

Linked List แบบซับซ้อน
1. Circular Linked List เป็นลิงค์ลิสต์ที่สมาชิกตัวสุดท้ายมีตัวชี้ (list) ชี้ไปที่สมาชิกตัวแรกของลิงค์ลิสต์ จะมีการทำงานไปในทิศทางเดียวเท่านั้นคือเป็นแบบวงกลม
2. Double Linked List เป็นลิงค์ลิสต์ที่มีทิศทางการทำงานแบบ 2 ทิศทาง ในลิงค์ลิสต์แบบ 2ทิศทาง ส่วนข้อมูลจะมีตัวชี้ไปที่ข้อมูลก่อนหน้า (backward pointer) และตัวชี้ข้อมูลถัดไป(forward pointer)

สแตค (Stack)
สแตคเป็นโครงสร้างข้อมูลที่มีลักษณะแบบลำดับ (sequential) คือการกระทำกับข้อมูลจะกระทำที่ปลายข้างเดียวกันที่ส่วนปลายสุดของสแตค การกระทำกับข้อมูลของสแตคประกอบไปด้วยการนำเข้าข้อมูลเข้า (PUSH) ที่ส่วนบนสุดของสแตค และการนำข้อมูลออก (POP) ที่ส่วนบนสุดของสแตคเช่นกัน ในการจะ Push ข้อมูลเข้าก็ต้องตรวจสอบด้วยว่าข้อมูลในสแตคเต็มหรือไม่ หากสแตคเต็มก็จะไม่สามารถ Push หรือนำข้อมูลเข้าได้ เช่นเดียวกับการ Pop ข้อมูลออกก็ต้องตรวจสอบด้วยว่ามีข้อมูลอยู่ในสแตคหรือไม่ หากไม่มีข้อมูลอยู่ในสแตคหรือสแตคว่าง (empty stack) ก็ไม่สามารถ pop ได้การนำข้อมูลเข้า-ออก จากสแตค (push , pop) จะมีลักษณะแบบเข้าหลัง ออกก่อน (LIFO : Last In , First Out) คือ ข้อมูลที่เข้าไปในสแตคลำดับหลังสุด จะถูกนำข้อมูลออกจากสแตคเป็นลำดับแรก

ตัวอย่าง การทำงานแบบโครงสร้างข้อมูลแบบสแตกที่สามารถเห็นได้ในชีวิตประจำวันทั่วไป
ได้แก่ การวางถาดซ้อนกันต้องวางถาดลงบนที่เก็บถาดจากล่างสุดที่ละถาด เมื่อมีการวางถาดช้อนกันแล้วเมื่อเราจะหยิบถาดไปใช้ เราต้องหยิบถาดบนสุด ซึ่งเป็นถาดที่ถูกวางเก็บเป็นอันดับสุดท้ายออกได้เป็นถาดแรก และสามารถหยิบออกที่ละถาดจากบนสุดเสมอ ส่วนถาดที่ถูกวางเก็บเป็นถาดอันแรก จะนำไปใช้ได้ก็ต่อเมื่อนำถาดที่วางทับมันอยู่ออกไปใช้เสียก่อน และจะหยิบออกไปใช้เป็นถาดอันสุดท้ายได้

วันพฤหัสบดีที่ 16 กรกฎาคม พ.ศ. 2552

การบ้านการใช้ iosteam.h และ stdio.h

<เขียนโปรแกรมโดยใช้ stdio.h >
#include
void main()
{
int N1;
int N2;
int Sum;
printf("Input frist integer number : ");
scanf("%d",&N1);
printf("Input second integer number : ");
scanf("%d",&N2);
Sum = N1 + N2;
printf("So %d + %d = %d",N1,N2,Sum);

}

<เขียนโปรแกรมโดยใช้ iostream.h >
#include
void main()
{
int N1;
int N2;
int Sum;
cout<<"Input frist integer number : "; cin>>N1;
cout<<"Input second integer number : "; cin>>N2;
Sum = N1 + N2;
cout<<"Sum ="<}

DTS04-15/07/2552

สรุปบทเรียน Set and String , Linked List

อะเรย์ของสตริง

ถ้าหากมีสตริงจำนวนมาก ก็ควรจะทำให้เป็นอะเรย์ของสตริง เพื่อที่จะเขียนโปรแกรมได้สะดวกการสร้างอะเรย์ของสตริง สามารถสร้างได้ทั้งแบบที่ให้ค่าเริ่มต้นและแบบที่กำหนดเป็นตัวแปรโดยดำเนินการตามแบบการกำหนดอะเรย์ 2 มิติ ฟังก์ชัน puts () ใช้ในการพิมพ์สตริงออกทางจอภาพ โดยการผ่านค่าแอดเดรสของสตริงไปให้เท่านั้น ข้อสังเกต การกำหนดอะเรย์ของสตริงในลักษณะอย่างนี้ ไม่ใช่อะเรย์ที่แท้จริงตามหลักการของอะเรย์ เนื่องจากขนาดของช่องในอะเรย์ไม่เท่ากัน แต่อนุโลมให้ถือว่าเป็นอะเรย์

อะเรย์ของสตริงที่ยาวเท่ากัน
อะเรย์ในลักษณะนี้จะถือว่าเป็นอะเรย์ที่แท้จริงและสามารถกำหนดได้ทั้งเมื่อมีการให้ค่าเริ่มต้น และเมื่อกำหนดเป็นตัวแปร โดยดำเนินการตามแบบการกำหนดอะเรย์ 2 มิติการกำหนดตัวแปรในลักษณะนี้ จะแตกต่างจากการกำหนดตัวแปรแบบความยาวไม่เท่ากัน คือ ในแบบความยาวไม่เท่ากัน ท้ายของสตริงจะเติม null character ให้เพียงตัวเดียว แต่ในแบบความยาวเท่ากัน จะเติม null character ให้จนครบทุกช่อง

ลิงค์ลิสต์ Linked Lists
โครงสร้างข้อมูลแบบลิงค์ลิสต์ เป็นโครงสร้างข้อมูลแบบไดนามิก โดยที่ขนาด ของมันสามารถเปลี่ยนแปลงได้ โดยสมาชิกแต่ละตัวของลิงค์ลิสต์จะถูกเรียกว่าโหนด (Node) ประกอบด้วย 2 ส่วนคือ ส่วนของข้อมูล (Data) และส่วนที่เป็นตำแหน่งที่อยู่ของ โหนดตัวต่อไปในลิงค์ลิสต์ (Next Address) หรืออาจเรียกว่า พอยเตอร์ (Pointer) ซึ่งทำให้ เราสามารถกำหนดตำแหน่งของโหนดตัวต่อไปได้ กล่าวคือ โหนดตัวแรกจะมี พอยเตอร์ ชี้ไปยังโหนดตัวที่สอง โหนดตัวที่สอง มีพอยเตอร์ชี้ไปยังโหนดตัวที่สาม เป็นเช่นนี้ไปเรื่อยๆ


โครงสร้างลิงค์ลิสต์ (Linked List Structure)
โครงสร้างข้อมูลลิงค์ลิสต์ประกอบไปด้วยข้อมูลที่เชื่อมโยงกันด้วยพอยเตอร์ สมาชิกแต่ละตัวในลิงค์ลิสต์เรียกว่า โหนด (Node) แต่ละโหนดจะประกอบขึ้นจากข้อมูล 2 ส่วนคือ
1. ส่วนที่ใช้เก็บข้อมูลข่าวสาร (information field)
2. ส่วนที่เป็นพอยเตอร์ซึ่งใช้สำหรับชี้ตำแหน่งที่อยู่ของสมาชิกตัวถัดไป



โครงสร้างของโหนด (Node Structure)
เราสามารถนิยามโครงสร้างของโหนดด้วยแบบข้อมูลโครงสร้างซึ่งประกอบด้วยฟิลด์ข้อมูลและฟิลด์พอยเตอร์ดังเช่น
struct Node { char Info;
struct Node *Next;
};
โครงสร้าง Node ประกอบด้วยฟิลด์ Info ซึ่งมีแบบข้อมูล char และฟิลด์ Next ซึ่งเป็นพอยเตอร์ชี้ไปที่ Node จะพบได้ว่าการนิยามโครงสร้าง Node อยู่ในรูปของรีเคอร์สีฟ โดยที่ฟิลด์ Next เป็นพอยเตอร์ที่ชี้ไปยังโครงสร้างของตัวเอง








วันพุธที่ 1 กรกฎาคม พ.ศ. 2552

DTS 03-01/07/2552

สรุปเนื้อหาบทเรียน "Data Structure"
เรื่อง Pointer ,Set and String



pointer

ตัวแปร Pointer เป็นตัวแปรชนิดหนึ่งที่ทำหน้าที่เก็บตำแหน่งที่อยู่Address ของตัวแปร แทนที่จะเก็บข้อมูลต่างๆ เหมือนตัวแปรชนิดอื่นๆ จากคุณสมบุติของ ตัวแปรชนิด Pointer จึงมองดูเหมือนกับ ตัวชี้ หรือพอยน์เตอร์ ซึ่งชี้ไปที่ Address ของตัวแปร
การกำหนดตัวแปร Pointer
การประกาศตัวแปร Pointer


จะคล้ายกับการกำหนดตัวแปรชนิดต่างๆ เพียงแต่ต้องมีเครื่องหมาย * หน้าชื่อตัวแปร ดังนี้

int *pt_X; สร้างตัวแปรพอร์ยเตอร์ชนิดintทำให้pt_xใช้เก็บตำแหน่งที่อยู่ขอตัวแปรชนิดintเท่านั้น
float*pt_num; สร้างตัวแปรพอร์ยเตอร์ชนิดfloatทำให้pt_numใช้เก็บตำแหน่งที่อยู่ของตัวแปรชนิดfloatเท่านั้น
char*pt_ch;สร้างตัวแปรพอร์ยเตอร์ชนิดcharทำให้pt_chใช้เก็บตำแหน่งที่อยู่ของตัวแปรชนิดcharเท่านั้น

โครงสร้างข้อมูลแบบ Set
เป็นโครงสร้างที่ข้อมูลแต่ละตัวไม่มีความสัมพันธ์กันเลย ตัวดำเนินการของเซ็ต ประกอบด้วย
-set intersection
-set union
-set difference

โครงสร้างข้อมูลแบบ String

สตริงเป็นโครงสร้างข้อมูลที่เป็นการรวบรวมโครงสร้างข้อมูลคาร์แรคเตอร์ (Character) ซึ่งเป็นตัวอักษรและสัญลักษณ์ (Symbol) ต่าง ๆ เป็นชนิดข้อมูลที่ถูกใช้งานมากชนิดหนึ่ง ภาษาเขียนโปรแกรมหลายภาษาจะกำหนดให้มาใช้งานได้ทันที เช่น ภาษาปาสคาล แต่บางภาษาไม่มีมาให้ เช่น ภาษาซี จะต้องสร้างขึ้นมาด้วยผู้เขียนโปรแกรม โดยนำโครงสร้างอาร์เรย์มาใช้และสมาชิกทุกตัวมีโครงสร้างข้อมูลคาร์แรคเตอร์ได้ชนิดเดียว